2016-07-09 21 views
2

Ich habe dieses Beispiel in einem Buch:Was ist der "Wert" einer Array-Variablen?

#define ALLOCSIZE 10000 /* size of available space */ 

static char allocbuf[ALLOCSIZE]; /* storage for alloc */ 
static char *allocp = allocbuf; /* next free position */ 

char *alloc(int n) /* return pointer to n characters */ 
{ 
    if (allocbuf + ALLOCSIZE - allocp >= n) { /* it fits */ 
     allocp += n; 
     return allocp - n; /* old p */ 
    } else /* not enough room */ 
     return 0; 
} 

void afree(char *p) /* free storage pointed to by p */ 
{ 
    if (p >= allocbuf && p < allocbuf + ALLOCSIZE) 
     allocp = p; 
} 

Ich muß wissen, was allocbuf darstellt (sein Wert), so wird er verwendet, in:

if (allocbuf + ALLOCSIZE - allocp >= n) 

, weil ich dieses Beispiel nicht vollständig verstehen konnte.

+5

Es wird in einen Zeiger auf das erste Element des Arrays im Ausdruck konvertiert. – MikeCAT

+0

in C führt die Bezugnahme auf einen Array-Namen zu der Adresse des ersten Byte des Arrays. – user3629249

+1

in C, seien Sie vorsichtig bei der Ausführung von Mathe auf Zeigern, Dies ist kein Problem, wenn die Zeiger auf das gleiche Array sind, (wie Sie sind), aber der Compiler wird auf alle Zeiger, die nicht auf das gleiche Array sind ersticken. – user3629249

Antwort

2

Zitiert C11, Kapitel §6.3.2.1/p3, (emphasis Mine)

Außer wenn es der Operanden des sizeof Operators, der _Alignof Operator oder der unären Operator & oder ist ein String-Literal zur Initialisierung eines Arrays, ein Ausdruck, der hat Typ '' Array des Typs '' wird in einen Ausdruck mit dem Typ '' Zeiger auf den Typ '' das po konvertiert ints zu dem Anfangselement des Array-Objekts und ist kein Lvalue. [...]

Also, in Ihrem Code, allocbuf, die ein Array-Typ ist, wenn sie als

if (allocbuf + ALLOCSIZE - allocp >= n) { 

zerfallen wird dem Zeiger auf das erste Element des Arrays verwendet.

1

In diesem Fall verfällt das Array in den Zeiger auf seinen Speicherort. Mit anderen Worten: der Zeiger auf sein erstes Element.

können Sie verwenden allocbuf (oder noch besser: &allocbuf[0], die besser die Bedeutung von „Zeiger auf das erste Element“ transportiert), um den Zeiger auf das erste Element zu bekommen, und allocp soll das nächste freie Element zeigen. So allocp - allocbuf wird Ihnen die Anzahl der Elemente "verwendet".