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