C++ 循环、作用域和堆栈(为什么这样行得通?)

标签 c++ scope stack

我发现很难找到此类问题的具体答案,但我会解释我认为这应该(不)有效的方式,也许有人可以告诉我哪里错了。

我在位于堆栈中的 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/

相关文章:

java错误: cannot find symbol stack.大小()

c++ - deadline_timer 奇怪的行为

c++ - 在类构造函数中声明的变量的范围是什么?

可以覆盖返回的结构吗?

java - 深度优先搜索多个解决方案

c - 函数堆栈帧中参数和局部变量的地址

c++ - 使用 GCC 在静态内存中分配 C++ 类

c++ - OpenCV 错误:断言失败 (buf.data && buf.isContinuous()) 在 cv::imdecode_,文件 ..\..\..\..\opencv\modules\highgui\src\loadsave.cpp

c++ - 如何在编译时交换可变参数模板的两个参数?

c++ - 在 C++ 的方法内部创建的对象实例的持久性