2016-12-15 90 views
2

這裏gdb不會在第4行停止。當用c語言創建靜態變量

enter image description here

接着,

沒有擊中在線路的聲明行:5,變量x被現有的和初始化。

enter image description here

接下來,

但在這裏它顯示出的範圍(是的,它應該按照我)。

enter image description here

現在,我有一個關於C程序的這一特定實例如下疑慮。

  1. P1()中的變量x的內存是否被創建並初始化?
  2. 爲什麼gdb沒有停在第一個例子中的P1()中的靜態聲明語句中?
  3. 如果我們再次調用P1(),程序控件是否會簡單地跳過聲明語句?
+2

http://stackoverflow.com/questions/30581675/what-actually-compiler-確實,當-WE-聲明靜態變量 – akira

+0

如果它得到每一次reinitilized又是什麼的'static'檢查[百科]的意思(https://en.wikipedia.org/wiki/Static_variable) – bansi

+2

相關:HTTP ://stackoverflow.com/q/5033627/694576 – alk

回答

1

它已被解釋(在相關主題鏈接在下面的評論問題)如何靜態變量的工作。

這裏是由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