このコード例を実行しました:
int *i = (int*) malloc( sizeof(int) );
printf( "%p, %p\n", &i , i );
これは私が得たものです:
0x7fff38fed6a8, 0x10f7010
では、なぜ 2 番目のアドレスが最初のアドレスよりも短いのだろうか?
このコード例を実行しました:
int *i = (int*) malloc( sizeof(int) );
printf( "%p, %p\n", &i , i );
これは私が得たものです:
0x7fff38fed6a8, 0x10f7010
では、なぜ 2 番目のアドレスが最初のアドレスよりも短いのだろうか?
i
はスタック上にありますが、それが指すメモリのチャンクはヒープ内にあります。あなたのプラットフォームでは、これらはメモリの2つの非常に異なる領域であり、たまたまヒープアドレスが数値的に比較的低いため、表示されていない先行ゼロが多数あります。
&i = 0x7fff38fed6a8; // stack
i = 0x0000010f7010; // heap
i
はヒープ上の&i
アドレス、 はスタック上のアドレスです。ヒープとスタックは異なるアドレス範囲を占めるため、異なる数値が表示されます。
ポインターは実際には異なる長さではありません: 短い方の前にゼロが付きます。おそらくこれを 64 ビット マシンで実行しているので、各ポインタは 64 ビット (16 桁の 16 桁) です。
短いのではなく、数が少ないだけです。ポインター &i はスタック上にあり、i はヒープ上にあります。
%p
フォーマット指定子が出力を固定長にパディングする必要はありません。したがって、印刷された表現からアドレスのメモリ内の「長さ」に関する情報を推測することはできません。たとえば、次のようにします。
const void *nada = NULL;
printf("NULL is at %p\n", nada);
次のようなものが表示される可能性があります。
NULL is at 0x0
もちろん、これはvoid *
、値が のときに型が魔法のように 4 ビットしか占めていないという意味ではありませんNULL
。単に、ポインター値が文字列に変換されたときに、先頭のゼロが省略されたことを意味します。
更新: 質問のコードを読み間違えました。無関係なテキストを削除しました。