繁体   English   中英

C ++读取上一个函数堆栈框架

[英]c++ reading previous function stack frame

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

#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读取堆栈时,它将读取与write写入的值相同的值。 但是为什么第一和第二个值总是这样?

正如其他人指出的那样,此行为是完全未定义的,因此即使您运行此代码1000次并看到此行为,第1001次也可能会看到一些不同的东西。 此外,您所看到的以及为什么将非常依赖于实现。 如果您真的对更好地理解这一点感到好奇,建议您查看一下由编译器生成的汇编代码,您会更好地了解堆栈的状态。 同样,您的操作方式取决于实现,但是使用gcc时,您可以将--save-temps选项传递给编译器,它将吐出中间文件供您阅读。 这可能非常有教育意义!

数组在堆栈空间中占据相同的大致邻近区域,但这只是一个巧合。 如果read()或write()中有更多变量,那就不再是这种情况了。 堆栈框架的结构是编译器中的一个实现细节-它取决于很多事情,例如函数中的变量,优化级别,编译器可能在堆栈上分配的临时存储空间,展开数据以获取功能异常或它的被叫者可能会抛出……简而言之,永远不要依赖它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM