1

私が読んでいる K&R 電子ブックで、次のコードに出くわしました。

コード

そして、私の懸念は次の行にありました:

allocbuf + ALLOCSIZE - allocp >= n

このコードは、バッファーの開始位置のアドレスを取得し、それ自体へのポインターのインデックスと、上記で定義された最大バッファー長定数を使用して、残りの割り当ての合計を計算します。

たとえば、文字ポインターを定義する場合、算術的に 1 ずつインクリメントする必要があることを理解しました。

char *ptr = "array";
ptr++;

次に、メモリ内の 2 番目の位置 'r' を取得します。メモリ内では、実際には sizeof(char) 単位でインクリメントされます。


したがって、配列がポインターを装って動作することを考えると、次のようになります。

allocbuf + 10000 

配列内で最後に割り当てられたスロットは正しいですか? ポインターは char 型であるため、10000 'slots' 後は実際には 10,000*sizeof(char) スロット後です。

この概念を明確にするために、たとえば 4210720 というランダムなメモリ アドレスが与えられた場合、4210721 はアドレスを超えたビット、バイト、またはその他のメティックを表しますか?

あれは:

void *ptr = "sherrellbc";
ptr++;

ptrは今どこに?タイプvoidはステップ長に関する情報を提供しないため、「s」と「h」の間のポインターにあります(たとえば、charポインターはsizeof(char)で増加します)。

本質的に、メモリはどのメトリックを使用して保存されますか? ビット、バイト、ニブルなど?

4

3 に答える 3

2

メモリ アドレスは、バイト レベルのメモリ操作を行わないコンピュータであっても、使用する可能性が高いすべてのコンピュータのバイト アドレスです。一部のコンパイラは、a のインクリメントvoid *をポインタへの 1 の追加と定義していますが、移植性はありません。

于 2013-07-13T20:06:50.420 に答える
1

void ポインターの逆参照は、本質的に未定義です。タイプが定義されている場合、インクリメントは常に

ptr+1 = next address of ptr type.
于 2013-07-13T20:07:13.820 に答える