gcc4.8.5使用です。
以下のコード
C
1#include <stdio.h> 2 3int a(){ 4 int x; 5 printf("aのx=%d &x=%p\n",x,&x); 6} 7int b(){ 8 int x; 9 printf("bのx=%d &x=%p\n",x,&x); 10} 11 12int main(void){ 13 printf("&a=%p\n",&a); 14 printf("&b=%p\n",&b); 15 a(); 16 b(); 17 a(); 18return 0; 19}
を実行してみたところ、
&a=0x561d9f4ec6aa
&b=0x561d9f4ec6f2
aのx=22045 &x=0x7fff1c391c84
bのx=22045 &x=0x7fff1c391c84
aのx=22045 &x=0x7fff1c391c84
と表示されました。
質問1:
以下の解釈で合っていますでしょうか?
(1)関数a(),b()内のローカル変数xは関数呼び出し時に生成されるのではなく、同じアドレスを使いまわしている。
(2)関数a(),b()はプログラムがロードされたときに固定したアドレスに配置されている。
質問2:
上記解釈の(1)に関連した質問として、a(),b()内のローカル変数xはいつ生成されたのでしょう。
関数a()のアセンブルは以下のようですが、どこでローカル変数xが生成されているのでしょうか?
a: push rbp mov rbp, rsp sub rsp, 16 mov eax, DWORD PTR [rbp-4] lea rdx, [rbp-4] mov esi, eax mov edi, OFFSET FLAT:.LC0 mov eax, 0 call printf leave ret

回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/20 07:25