c语言创建静态变量时

When static variables are created in c language

这里gdb不会停在Line:4。

接下来,

没有点击 Line:5 处的声明行,变量 x 已存在并已初始化。

接下来,

但这里显示超出范围(是的,根据我的说法应该如此)。

现在,我对这个特定的 c 程序实例有以下疑问。

  1. P1() 中变量 x 的内存何时被创建和初始化?
  2. 为什么 gdb 在第一个例子中没有在 P1() 内部的静态声明语句处停止?
  3. 如果我们再次调用P1(),程序控制会直接跳过声明语句吗?

已经解释了(在问题下方评论中链接的相关主题中)静态变量是如何工作的。

这是 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    [=10=]x8,%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    [=10=]x5,%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    [=10=]x0,%edi
  20:   b8 00 00 00 00          mov    [=10=]x0,%eax
  25:   e8 00 00 00 00          callq  2a <p1+0x2a>
}
  2a:   90                      nop
  2b:   48 83 c4 08             add    [=10=]x8,%rsp
  2f:   c3                      retq   

因此,如您所见,没有用于声明 x 的代码。 GDB 只能在实际的机器代码指令处中断,因为存在 none,它在下一条指令 (mov) 处中断,该指令与第 5 行匹配。