2016-07-09 1 views
2

私は本の中で、この例があります:配列変数の「値」とは何ですか?

#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; 
} 

私は(その値)allocbufが何を表すかを知っている必要があるので、それがで使用されている:私は完全にこの例を理解できなかったので

if (allocbuf + ALLOCSIZE - allocp >= n) 

+5

これは、式の配列の最初の要素へのポインタに変換されます。 – MikeCAT

+0

Cで、配列名を参照すると、配列の最初のバイトのアドレスになります。 – user3629249

+1

のC言語では、ポインタの算術演算には注意が必要です。同じ配列にポインタを置いても問題はありませんが、コンパイラは同じ配列ではないポインタを詰まらせるでしょう。 – user3629249

答えて

2

C11を引用し、章§6.3.2.1/ P3(強調鉱山

それはsizeofオペレータ、_Alignofオペレータ、または 単項&演算子のオペランドである場合を除き、または タイプ「配列のタイプ」がのタイプの「式へのポインタ」のpoの式に変換される式を配列の初期化に使用する文字列リテラルです。 intは配列オブジェクトの最初の要素に付けられ、左辺値ではありません。 [...]

したがって、

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

として使用される場合、配列型であるコード、allocbufに配列の最初の要素へのポインタに減衰します。

1

この場合、アレイはその格納場所へのポインタに減衰します。つまり、最初の要素へのポインタ。

あなたは(より良いまだか:より良い「最初の要素へのポインタ」の意味を輸送&allocbuf[0]allocbufを使用することができます最初の要素へのポインタを取得するために、そしてallocp次のフリーの要素を指すように意図されます。だからallocp - allocbufはあなたに "used"要素の数を与えるでしょう。

関連する問題