C++ 读取前一个函数堆栈帧

标签 c++ arrays stack

我有一个由函数(名为 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 选项传递给编译器,它会吐出中间文件供您细读。这非常有教育意义!

关于C++ 读取前一个函数堆栈帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34427775/

相关文章:

c++ - 将 QTImage 与 OpenGL 结合使用

c++ - 将参数包解压到字符串 View 中

javascript - 给定一个数组,编写一个返回该数组所有可能的三元组/序列的函数? JavaScript

C读取输入文件并对一种类型进行升序排序

python - 递归——Python,返回值问题

c - 哪些工具可以捕获C中的缓冲区溢出?

c++如何用泛型异常对象处理所有类型的异常?

c++ - ifstream 构造函数返回损坏的对象

c++ - 动态数组的初始化列表?

python - Pandas - 多列到 "column name - value"列