C中的数组内存分配取决于命名约定?

时间:2015-09-02 03:30:02

标签: c arrays memory memory-management global-variables

我在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每次都会将连续的块分配给不同的全局数组?其次,当我添加前缀时,为什么内存分配的顺序会发生变化?

希望这并不会让每个人感到困惑,因为它有我...感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

  

首先,为什么C将连续的块分配给不同的全局   每次都有数组?

因为一个连续的块更有效且更容易实现。如果应用程序在不同的内存块中分配全局变量,那么它至少有一个缺点:

  1. 街区之间浪费了记忆。
  2. 开始时的复杂内存分配。
  3. 因此,工具链会尝试在一个连续的内存块中分配所有全局变量。