我有一个由函数(名为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读取堆栈时,它读取的值与写的值相同。但是为什么第一个和第二个值总是这样?
发布于 2015-12-22 18:45:58
正如其他人所指出的,这种行为是完全没有定义的,所以即使您运行此代码1000次并看到此行为,您也可能在第1001次看到一些不同的情况。此外,您所看到的以及为什么将非常依赖于实现。如果您真的对更好地理解这一点感到好奇,我建议您查看编译器生成的汇编代码,这样您就可以更好地了解堆栈的运行情况。同样,您将如何实现依赖于实现,但是使用gcc,您可以将--save-temps
选项传递给编译器,它会将它的中间文件提供给您阅读。这是很有教育意义的!
发布于 2015-12-22 18:45:27
数组在堆栈空间中占据相同的一般范围,但这只是巧合。如果读()或写()中有更多的变量,那么情况就不再是这样了。堆栈帧的结构是编译器中的一个实现细节--它取决于许多事情,比如函数中的变量、优化级别、编译器可能在堆栈上分配的临时存储空间、为函数或其调用程序可能抛出的异常释放数据.总之,永远不要依赖它。
从C++标准的角度来看,读取未初始化的变量(如read
中的array
)是一种未定义的行为--从获取虚假值到程序崩溃,任何事情都可能发生。
https://stackoverflow.com/questions/34427775
复制相似问题