为什么以下代码每次输出相同的内存位置?
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
是的,你绝对正确的记忆位置可能会改变.但它没有:).在每次迭代中,旧变量被"销毁",并且在同一位置"创建"新变量.虽然任何体面的编译器都会优化不必要的"动作"
这是编译器优化。由于局部变量将超出范围并且即将创建完全相同类型的变量,因此它会重用内存地址。值得注意的是,就您的程序而言,这仍然是一个“新鲜”或“新”变量。
比较以下代码片段和输出:
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