1

このコード例を実行しました:

int *i = (int*) malloc( sizeof(int) );
printf( "%p, %p\n", &i , i );

これは私が得たものです:

0x7fff38fed6a8, 0x10f7010

では、なぜ 2 番目のアドレスが最初のアドレスよりも短いのだろうか?

4

5 に答える 5

5

iはスタック上にありますが、それが指すメモリのチャンクはヒープ内にあります。あなたのプラットフォームでは、これらはメモリの2つの非常に異なる領域であり、たまたまヒープアドレスが数値的に比較的低いため、表示されていない先行ゼロが多数あります。

&i = 0x7fff38fed6a8; // stack
 i = 0x0000010f7010; // heap
于 2012-05-15T09:13:37.927 に答える
4

iはヒープ上の&iアドレス、 はスタック上のアドレスです。ヒープとスタックは異なるアドレス範囲を占めるため、異なる数値が表示されます。

ポインターは実際には異なる長さではありません: 短い方の前にゼロが付きます。おそらくこれを 64 ビット マシンで実行しているので、各ポインタは 64 ビット (16 桁の 16 桁) です。

于 2012-05-15T09:12:40.447 に答える
1

他の答えに加えて:

インクルードしなかったため、コンパイラが、mallocがではなく<stdlib.h>戻り値を返すと誤って想定する可能性が高くなります。これはおそらく深刻なバグであり、mallocの戻り値の型キャストで隠してしまいました。これこれを読んでください。intvoid*

intたとえば、多くの16ビットまたは64ビットCPUで、特定のシステムのアドレスバスとは異なる幅がある場合、誤った結果が得られます。

于 2012-05-15T11:15:27.427 に答える
1

短いのではなく、数が少ないだけです。ポインター &i はスタック上にあり、i はヒープ上にあります。

于 2012-05-15T09:13:20.343 に答える
1

%pフォーマット指定子が出力を固定長にパディングする必要はありません。したがって、印刷された表現からアドレスのメモリ内の「長さ」に関する情報を推測することはできません。たとえば、次のようにします。

const void *nada = NULL;

printf("NULL is at %p\n", nada);

次のようなものが表示される可能性があります。

NULL is at 0x0

もちろん、これはvoid *、値が のときに型が魔法のように 4 ビットしか占めていないという意味ではありませんNULL。単に、ポインター値が文字列に変換されたときに、先頭のゼロが省略されたことを意味します。

更新: 質問のコードを読み間違えました。無関係なテキストを削除しました。

于 2012-05-15T09:11:15.617 に答える