我有一个由函数(名为 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/