- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个由函数(名为 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/
我的应用将 SceneKit 内容的“页面”与图像和文本交替。当我从图像页面前进到新的 SceneKit 页面时,前一个 SceneKit 页面中的内容会短暂显示,然后被新内容替换。时髦。 我只使用一
我正在尝试处理(在 C# 中)包含一些数字数据的大型数据文件。给定一个整数数组,如何对其进行拆分/分组,以便如果下一个 n(两个或更多)是负数,则前一个 n 元素被分组。例如,在下面的数组中,应该使用
刚接触promises,研究过。所以我的代码和我的理解: sql.connect(config).then(function(connection) { return connection.req
目前我在 if (roobaf) block 中有一些代码,这取决于 foo 和 bar 是否为假。我可以在 block 内再次检查这些条件,但感觉像是不必要的代码重复。 if (foo) {
我是一名优秀的程序员,十分优秀!