6

バックステージでのプリミティブ型の宣言と割り当てのプロセスを理解しようとしています。

  1. int i;
  2. i = 3;

1) の場合、メモリ スタック上に、i という名前の int 型の値を格納するためのスペースを割り当てます 2) の場合、上記で確保したスペースに値 3 を割り当てます

そこにメモリアドレスはありますか?私の印象では、メモリアドレスは常にヒープ上のオブジェクトに関連付けられていますか?

アップデート:

返信について:

したがって、スタック上のすべての変数には、ヒープ上のオブジェクトと同様に、すべてメモリ アドレスが割り当てられます。私は正しいですか?

しかし、Java の場合はそうではありませんか?

4

4 に答える 4

5

関係するアドレスが常にあるとは限りません。コンパイラーは、変数のアドレスがプログラマーによって取得されないことがわかった場合、変数をレジスターに入れることができます。したがって、メインメモリにアクセスする必要はありません。たとえば、上記のコードでは、コンパイラが生成できるものは、次のように単純である可能性があります。

add $2, $0, 3

値3をレジスター2に入れます。ポインターを作成してその変数を指すようにすると、実際にはアドレスが得られます。そして、変数はもはやレジスターにのみ存在することはできません。

于 2008-11-25T03:42:35.237 に答える
1

あなたが C または C++ について話していると仮定すると (私にはわかりません)、はい。次のようにアドレスにアクセスできます。

int i = 3;

int *k = &i; // k now is a pointer to i

*k = 4; // assigns the value k points to (i) to 4, i is now 4
于 2008-11-25T02:38:20.500 に答える
0

スタック バッファ オーバーフローは他にどのように発生しますか? :) 誰かがスタックへのポインタに書き込んでいる必要があります。

于 2008-11-25T02:45:29.080 に答える
0

実際、スタックはプロセス仮想メモリの特別な領域であるため、スタック内のすべてにメモリアドレスがあります。ESP (SP) レジストリ (x86 アーキテクチャ) が保持するスタックの先頭。スタックアドレスは通常、メモリアドレスよりも低くなります。これは、スタックが仮想メモリのプロセスの開始点の近くに配置され、その後ヒープされるためです。

于 2011-01-24T20:18:24.947 に答える