2
這裏gdb不會在第4行停止。當用c語言創建靜態變量
接着,
沒有擊中在線路的聲明行:5,變量x被現有的和初始化。
接下來,
但在這裏它顯示出的範圍(是的,它應該按照我)。
現在,我有一個關於C程序的這一特定實例如下疑慮。
- P1()中的變量x的內存是否被創建並初始化?
- 爲什麼gdb沒有停在第一個例子中的P1()中的靜態聲明語句中?
- 如果我們再次調用P1(),程序控件是否會簡單地跳過聲明語句?
這裏gdb不會在第4行停止。當用c語言創建靜態變量
接着,
沒有擊中在線路的聲明行:5,變量x被現有的和初始化。
接下來,
但在這裏它顯示出的範圍(是的,它應該按照我)。
現在,我有一個關於C程序的這一特定實例如下疑慮。
它已被解釋(在相關主題鏈接在下面的評論問題)如何靜態變量的工作。
這裏是由gcc爲你的p1函數生成的實際代碼(通過gcc -c -O0 -fomit -frame-pointer -g3 staticvar.c -o staticvar.o),然後用相關源進行反彙編。
Disassembly of section .text:
0000000000000000 <p1>:
#include <stdio.h>
void p1(void)
{
0: 48 83 ec 08 sub $0x8,%rsp
static int x = 10;
x += 5;
4: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # a <p1+0xa>
a: 83 c0 05 add $0x5,%eax
d: 89 05 00 00 00 00 mov %eax,0x0(%rip) # 13 <p1+0x13>
printf("%d\n", x);
13: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # 19 <p1+0x19>
19: 89 c6 mov %eax,%esi
1b: bf 00 00 00 00 mov $0x0,%edi
20: b8 00 00 00 00 mov $0x0,%eax
25: e8 00 00 00 00 callq 2a <p1+0x2a>
}
2a: 90 nop
2b: 48 83 c4 08 add $0x8,%rsp
2f: c3 retq
因此,正如您所看到的,沒有聲明x的代碼。 GDB只能打破實際機器代碼指令和作爲沒有,它打破上下一指令(MOV),它匹配線5
http://stackoverflow.com/questions/30581675/what-actually-compiler-確實,當-WE-聲明靜態變量 – akira
如果它得到每一次reinitilized又是什麼的'static'檢查[百科]的意思(https://en.wikipedia.org/wiki/Static_variable) – bansi
相關:HTTP ://stackoverflow.com/q/5033627/694576 – alk