我在C中遇到了一个奇怪的现象,我需要有人来解释。我有下面的代码,2个单元素数组作为全局变量。我正在打印每个数组的第一个和第二个元素的内存地址(请注意,该数组被定义为只有一个元素):
#include <stdio.h>
int a1[1];
int a2[1];
int main(void) {
a1[0] = 100;
a2[0] = 200;
printf("%d\n", &a1[0]);
printf("%d\n", &a1[1]);
printf("%d\n", &a2[0]);
printf("%d\n", &a2[1]);
}
这给出了以下输出。注意,C在a1之后为数组a2分配了一个连续的内存块(因此a1 [1]和a2 [0]的地址相同):
4223424
4223428
4223428
4223432
但是,当我更改数组的名称时会出现奇迹。我添加了&#34; zzz&#34;作为两个数组的前缀,如下所示。
#include <stdio.h>
int zzza1[1];
int zzza2[1];
int main(void) {
zzza1[0] = 100;
zzza2[0] = 200;
printf("%d\n", &zzza1[0]);
printf("%d\n", &zzza1[1]);
printf("%d\n", &zzza2[0]);
printf("%d\n", &zzza2[1]);
}
运行此代码后,您可以从以下输出中看到,首先为阵列zzza2分配内存,然后为zzza1分配内存(&amp; a2 [1] =&amp; a1 [0]):
4223428
4223432
4223424
4223428
我已经在不同的时间在不同的机器上测试了多个阵列大小(2,4,8)的上述代码并得到了相同的输出,所以这不是巧合。当我将main()中的变量定义为局部变量时,不会发生这种情况。
C似乎是根据我们为数组提供的名称来分配内存。首先,为什么C每次都会将连续的块分配给不同的全局数组?其次,当我添加前缀时,为什么内存分配的顺序会发生变化?
希望这并不会让每个人感到困惑,因为它有我...感谢你的帮助!
答案 0 :(得分:1)
首先,为什么C将连续的块分配给不同的全局 每次都有数组?
因为一个连续的块更有效且更容易实现。如果应用程序在不同的内存块中分配全局变量,那么它至少有一个缺点:
因此,工具链会尝试在一个连续的内存块中分配所有全局变量。