我发现很难找到此类问题的具体答案,但我会解释我认为这应该(不)有效的方式,也许有人可以告诉我哪里错了。
我在位于堆栈中的 main 中创建了一个大小为 10 的整数数组。然后我使用 for 循环将整数 0-9 加载到该数组中。当 for 循环结束时,栈指针回到初始化 arr1 后的位置,但那些值仍然存在于内存中,数组仍然指向它们。
然后,我使用另一个 for 循环填充堆栈,这应该会覆盖在第一个 for 循环中创建的值,现在当我访问 arr1 中的值时,它们应该指向值为 5000 的整数。
当我打印数组时,它仍然打印出数字 0-9。为什么这行得通?我认为在循环中声明的数据在超出范围时会从堆栈中弹出。谢谢
int main(void)
{
int arr1[10];
for(int i = 0; i < 10; i++)
arr1[i] = i;
for(int i = 0; i < 500; i++)
int a = 5000;
for(int i = 0; i < 10; i++)
cout << arr1[i] << endl;
system("PAUSE");
return 0;
}
最佳答案
您似乎误解了 C++ 中的数据生命周期。当在作用域 block 中(无论是在函数、循环还是其他控制结构中)声明本地数据时,它会保留在堆栈中,直到该作用域 block 结束。
这意味着整个 arr1
都保持分配状态并在堆栈中,直到 main()
完成,无论您还做什么。它不会被同一函数中的后续局部变量或嵌套在更深范围 block 中的变量覆盖。
在您的第二个循环中,变量 a
(理论上)在循环体的每次迭代 中被创建和销毁。这意味着在循环期间您不会在堆栈上有 500 个 a
实例——您只有一个。 (实际上,编译器几乎肯定会优化它,因为它没有做任何有用的事情。)
关于C++ 循环、作用域和堆栈(为什么这样行得通?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22135644/