gpt4 book ai didi

c++读取先前的函数堆栈帧

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:14 27 4
gpt4 key购买 nike

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

read函数不应该从栈中读取同样的数组内容吗?

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

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

最佳答案

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com