Search code examples
cstaticgdballocation

When static variables are created in c language


Here gdb does not stop at Line:4.

enter image description here

Next,

Without hitting the declaration line at Line:5, variable x is existing and initialized.

enter image description here

Next,

But here it shows out of scope (yes it should according to me).

enter image description here

Now, I have the following doubts regarding this particular instance of c program.

  1. When exactly the memory for variable x in P1() gets created and initialized?
  2. why gdb did not stop at static declaration statement in inside P1() in the first example?
  3. If we call P1() again will the program control simply skip the declaration statement?

Solution

  • It has already been explained (in related topics linked in comments below question) how static variables work.

    Here is actual code generated by a gcc for your p1 function (by gcc -c -O0 -fomit-frame-pointer -g3 staticvar.c -o staticvar.o) then disassembled with related source.

    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   
    

    So, as you see there is no code for declaration of x. GDB can only break on actual machine code instruction and as there is none, it breaks on next instruction (mov), which matches line 5.