2016-12-15 7 views
2

ここで、gdbは行:4で停止しません。ラインでの宣言行を押すことなく静的変数がC言語で作成されている場合

enter image description here

次に、

:5は、変数xは、既存および初期化されます。

enter image description here

次に、

しかし、ここでそれは(はい、それは私に応じなければならない)の範囲の外に示しています。

enter image description here

は今、私は、Cプログラムのこの特定のインスタンスに関する次の疑問を持っています。

  1. P1()の変数xのメモリが作成され、初期化されると正確になるでしょうか?
  2. 最初の例では、内部のP1()内の静的宣言文でgdbが停止しなかったのはなぜですか?
  3. P1()をもう一度呼び出すと、プログラムコントロールは単に宣言文をスキップしますか?
+2

http://stackoverflow.com/questions/30581675/what-actually-compiler-私たちが宣言した静的変数 – akira

+0

が毎回再初期化される場合、 'static' check [Wiki](https://en.wikipedia.org/wiki/Static_variable)の意味は何ですか? – bansi

+2

関連:http ://stackoverflow.com/q/5033627/694576 – alk

答えて

1

静的変数がどのように機能するかについては既に説明しています。

p1関数のgcc(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行に一致します。

関連する問題