我们今天在数据结构类中讨论了不同的编译器行为。下面的例子(以及我的一些cout和其他修改)作为一个程序可以在g ++上编译,但不一定在所有其他编译器上编译。
#include <iostream>
using namespace std;
int main(void)
{
int i;
int j = 5;
cout << "i address: " << &i << " -- j address: " << &j
<< endl << "enter size: ";
cin >> i;
cout << "value i: "<< i << "; size memory of i (ints): "<<(&i - &j)<< endl;
int a[i];
cout << "address of array a start: " << a << endl;
int b = 14;
cout << "value b: " << b << "; b address= " << &b << endl
<< "distance bt j and b(ints): "<< (&j - &b) << endl;
cout << "distance bt b and start of array(ints): " << (&b - a) << endl;
}
在玩完输入后(并学习一下动态数组在过程中如何分配内存),我认为输入0是最有趣的。输出:
i address: 0x7fff5b303764 -- j address: 0x7fff5b303760
enter size: 0
value i: 0; size memory of i (ints): 1
address of array a start: 0x7fff5b3036b0
value b: 14; b address= 0x7fff5b303754
distance bt j and b(ints): 3
distance bt b and start of array(ints): 41
g ++如何知道将数组视为一个需要动态创建的数组,而不是立即尝试静态创建一个无论是i的默认值还是抛出某种编译时错误?
j和b之间的距离是3个百分点的记忆而不是预期的1.这是怎么回事?我怀疑,纯粹是通过玩这个程序收集的经验证据,它与couts有关,但我不熟悉它们将如何/为什么以看似随机的数量存储在内存中。
我为数组a的大小输入0,基于不同大小的游戏,我认为长度为0的动态数组不太可能被初始化为41的长度。所以,如果它不是数组占用了所有这41个内存的内存,然后存储在b(存储在堆栈中的最后一个数据)和数组a(有意存储在堆上的第一个数据)之间,为什么它在那里呢? / p>
答案 0 :(得分:2)
a
是一个可变长度数组,它不是标准C ++的一部分,而是g ++扩展。 g ++知道它不是一个在编译时确定大小的常规数组,因为i
不是编译时常量,例如const int i = 3;
a
没有存储在堆上。它存储在堆栈中。我想j
和b
之间的地址距离取决于分配给a
的大小,这只能在运行时知道。我不知道如何考虑大小为b
和a
之间的距离。如果你在调试模式下构建,可能会在数组之后添加一些额外的隐藏缓冲区以便检测超出数组范围的意外覆盖。