C中的For循环局部变量

Ama*_*wal 14 c

为什么以下代码每次输出相同的内存位置?

int x;
for (x = 0; x < 10; x++) {
    int y = 10;
    printf("%p\n", &y);
}
Run Code Online (Sandbox Code Playgroud)

我认为每次运行for循环时内存位置都应该改变,变量是新的.

Arm*_*yan 18

是的,你绝对正确的记忆位置可能会改变.但它没有:).在每次迭代中,旧变量被"销毁",并且在同一位置"创建"新变量.虽然任何体面的编译器都会优化不必要的"动作"

  • 如果你想要持久的数据结构,他们必须在'堆'而不是'堆栈'上创建.为此使用'malloc'等. (4认同)

Aln*_*tak 5

是的,每次变量都是新的,但是在块结束时,堆栈上的任何新变量都会再次释放.

因此,下一次堆栈指针就会回到原来的位置.注意:这种行为很常见,但标准并不能保证.


Osc*_*orz 5

这是编译器优化。由于局部变量将超出范围并且即将创建完全相同类型的变量,因此它会重用内存地址。值得注意的是,就您的程序而言,这仍然是一个“新鲜”或“新”变量。

比较以下代码片段和输出:

for (i = 0; i < 3; i++) {
    int n = 0;
    printf("%p %d\n", (void *)&n, n++);
}
Run Code Online (Sandbox Code Playgroud)
0x7fff56108568 0
0x7fff56108568 0
0x7fff56108568 0
for (i = 0; i < 3; i++) {
    static int n = 0;
    printf("%p %d\n", (void *)&n, n++);
}
Run Code Online (Sandbox Code Playgroud)
0x6008f8 0
0x6008f8 1
0x6008f8 2