2011-07-06 19 views
5

C配列/ポインタの問題

#define ALLOCSIZE 1000 
static char allocbuf[MAXLINE]; 
static char *allocp = allocbuf 

char *alloc(int n){ 
     if (allocbuf+ALLOCSIZE-allocp>=n){ 
       allocp+=n; 
       return allocp-n; 
     } 
     else { ... } 

を私は私の質問は非常に簡単です怖いんだけど、私は「もしラウンド私の頭を取得することはできません"行。 allocbufはどんな価値がありますか?それは文字配列ですよね?私は本の配列のものを振り返りましたが、それは助けになりませんでした。 allocpは最初に配列の0番目の要素を指し示します。

+0

ALLOCSIZEとは何ですか? allocbufは定数(配列のアドレス)なので、他の値をとることはできません。 – deStrangis

+0

コードに何かがないと思います –

+0

申し訳ありませんが、#define行が間違っています...編集 –

答えて

2

allocbufは、タイプchar []の配列ですが、多くの場合、識別子自体は、配列の開始アドレスを保持するタイプchar *のポインタに減衰します。これは、allocbufがポインタであることを意味するものではなく、まだ配列です。

したがって、ifステートメントの条件は、いくつかのポインタ演算を実行します。

+0

ただし、if文は次のようにするべきではありません:if(pntr + ALLOCSIZE-allocp> = n)、char * pntr =&allocbuf? –

+0

あなたはこれについて絶対に正しいです、これは原則として正しい方法です。 C言語では、このコンテキストでは 'allocbuf'が'&allocbuf'と同じになるようなショートカット構文があります。 –

+0

ありがとうございます。また、他にどのような「コンテキスト」がありますか?算術演算は、配列へのポインタを意味するためにコンパイラによって暗示されますか? –

0

allocbufをRAMの先頭へのポインタ、つまり0と考えると、allocbuf + ALLOCSIZEはRAMの最後を指しています。 allocpは割り当てられた領域の終わりを指していて、RAMの途中にあります。したがって、allocbuf + ALLOCSIZE-allocpはあなたに空きメモリサイズを与えます。 ifステートメントは、要求された割り当てサイズ(n)が利用可能な空きメモリよりも小さいかどうかをチェックします。

+0

私は算術を理解しています。この本はそれを説明するのに役立つ素敵な絵を持っています。これは、配列へのポインタとして配列名を使用することです。私はそれの周りに私の頭を得ることができません。 –

0

allocbufは静的な配列ですが、実際には連続した文字セット(配列)の最初の要素を指しています。 allocpは連続した配列への別のポインタで、その値を配列要素を指すように変更できます。

+0

* allocbufは静的配列ですが、実際には最初の要素を指しています* *配列は何も指していません。識別子がポインタに崩壊するだけです。 –

+0

ありがとうございます。私が持っている問題はあなたの最初の文章にあります。 "allocbufは静的配列です...それは...を指します"。ポインタではない場合、どのようにポイントすることができますか? –

1

allocpとallocbufは両方ともchar配列(char *)であり、allocpは初期化後、そしてifボディを経由した後のバッファの最初のcharを効果的に指します。同じアドレスと割り当てられたバイト数であり、この数は "if"本体の新しいサイクルごとに増加します。要約すると、バッファ内の最初の空きcharを指しています。 "if"行は、staticbuildbufにn個の文字を割り当てるための十分な場所があるかどうかを検証することを目的としています。次のように この行はdiscomposedすることができます

char* static_buffer_beginning = allocbuf; 
char* static_buffer_ending = static_buffer_beginning + MAXLINE; 
int nb_chars_still_available = static_buffer_ending - allocp; 
if (nb_chars_still_available >= n) { 

私はあなたのコードで表示される「ALLOCSIZE」でちょっと混乱している:それはから来たん彼の価値は、何ですか私はそれが誤植であると想定しており、その価値はMAXLINEと同じですが、あなたに間違った答えを与えないようにしたいと思います。

+0

MAXLINEを無視します。私はALLOCBUFを意味するとき、念入りにそれを打ち込んでいませんでした。私はその質問を編集した。 –

+0

よろしいですか?その後、MAXLINEをALLOCSIZEに置き換えるか、どのマクロを使用するかは同じです。 – psycho

+0

Hmmm、stackOverflowには全く新しいので、私からの答えではないとコメントする方法はわかりませんが、@Blagovest Buyuklievの最初のコメントには全く同意しません。 'char * pntr = allocbuf;'はOKですが、 'char * pntr =&allocbuf;'が間違っているとgccは互換性のないポインタ型を生成します。 – psycho