首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >c++读取以前的函数堆栈帧

c++读取以前的函数堆栈帧
EN

Stack Overflow用户
提问于 2015-12-22 18:37:40
回答 2查看 273关注 0票数 2

我有一个由函数(名为write)创建的数组。在该函数返回后,我调用另一个函数(名为read),它直接从堆栈中读取相同大小的数组。

代码语言:javascript
运行
AI代码解释
复制
#include <iostream>
using std::cout;
using std::endl;

void write();
void read();

int main(void)
{
    write();
    read();

    return 0;
}

// Write an array of 10 ints to the stack
void write() {
    int array[10];
    for(int i = 0; i < 10; i++)
        array[i] = i;
}

// Read an array of 10 from stack
void read() {
    int array[10];
    for(int i = 0; i < 10; i++)
        cout << array[i] << endl;
}

读取函数不应该从堆栈读取相同的数组内容吗?

我发现有趣的是,第一个和第二个数组值总是相同的。第一个(在索引0处)是一个负垃圾值。第二个(在索引1处)是0。

据我所知,当函数返回时,它不会清理它的堆栈框架。因此,当read读取堆栈时,它读取的值与写的值相同。但是为什么第一个和第二个值总是这样?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-22 18:45:58

正如其他人所指出的,这种行为是完全没有定义的,所以即使您运行此代码1000次并看到此行为,您也可能在第1001次看到一些不同的情况。此外,您所看到的以及为什么将非常依赖于实现。如果您真的对更好地理解这一点感到好奇,我建议您查看编译器生成的汇编代码,这样您就可以更好地了解堆栈的运行情况。同样,您将如何实现依赖于实现,但是使用gcc,您可以将--save-temps选项传递给编译器,它会将它的中间文件提供给您阅读。这是很有教育意义的!

票数 2
EN

Stack Overflow用户

发布于 2015-12-22 18:45:27

数组在堆栈空间中占据相同的一般范围,但这只是巧合。如果读()或写()中有更多的变量,那么情况就不再是这样了。堆栈帧的结构是编译器中的一个实现细节--它取决于许多事情,比如函数中的变量、优化级别、编译器可能在堆栈上分配的临时存储空间、为函数或其调用程序可能抛出的异常释放数据.总之,永远不要依赖它。

从C++标准的角度来看,读取未初始化的变量(如read中的array )是一种未定义的行为--从获取虚假值到程序崩溃,任何事情都可能发生。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34427775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档