什么是变量内部块的生命周期?

PcA*_*cAF 6 c c++ memory x86 stack

这里这里我发现块中的变量是在执行到达该块时创建的,

为了证明我试过这个:

 int main()
{

  {
      char a;
      printf("Address of a %d \n",&a);
  }

  char b;
  printf("Address of b %d \n",&b);

}
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,首先创建了b(因为外部块比内部执行得更早),并且当执行到达内部块时,创建了a.输出上面的代码:

Address of a 2686766
Address of b 2686767
Run Code Online (Sandbox Code Playgroud)

(在x86上测试(堆栈向下增长,因此首先创建具有更大地址的变量)).

但是这个怎么样?:

int main()
{

   {
       char a;
       printf("Address of a %d \n",&a);
   } // I expected that variable a should be destroyed here


   {
       char b;
       printf("Address of b %d \n",&b);
   }

}
Run Code Online (Sandbox Code Playgroud)

输出:

Address of a 2686767
Address of b 2686766
Run Code Online (Sandbox Code Playgroud)

我期望a在第一个块语句的右括号中被销毁,所以a所在地址现在是堆栈的顶部,并且应该在这里创建b,因此在上面的输出中两个地址应该相等,但它们不是?在块结束时变量是否被破坏?如果没有,为什么?

Bo *_*son 10

编译器如何将变量放在内存中没有规则.如果在某种程度上"更容易",它可以同时为两者保留空间.

允许再利用的空间在不同范围的变量,但不是必需的.保存单个字节可能不值得尝试"优化"分配.