Распределение памяти массива в C зависит от соглашения об именах?

Я столкнулся с странным явлением в 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]);
}
</stdio.h>

Это дает следующий результат. Обратите внимание, что C выделяет смежный блок памяти для массива a2 сразу после a1 (следовательно, адрес a1 [1] и a2 [0] одинаковый):

4223424
4223428
4223428
4223432

Однако, когда я изменяю имена массивов, возникает что-то чудесное. Я добавил "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]);
}
</stdio.h>

После запуска этого кода вы можете увидеть из следующего вывода, что память была сначала выделена для массива zzza2, а затем для zzza1 (& a2 [1] = & a1 [0]):

4223428
4223432
4223424
4223428

Я тестировал вышеуказанный код с несколькими размерами массивов (2,4,8) на разных компьютерах в разное время и получил тот же результат, что и не совпадение. Этого не происходит, когда я определяю переменные в main() как локальные переменные.

Кажется, что C выделяет память на основе имени, которое мы предоставляем массивам. Во-первых, почему C каждый раз выделяет непрерывные блоки для разных глобальных массивов? Во-вторых, когда я добавляю префикс, почему изменяется порядок распределения памяти?

Надеюсь, это не сбивает с толку всех, поскольку у меня есть... Спасибо за вашу помощь заранее!

1 ответ

Во-первых, почему C выделяет смежные блоки для разных глобальных массивы каждый раз?

Поскольку один непрерывный блок более эффективен и проще реализовать. Если приложение выделяет глобальные переменные в разных блоках памяти, у него есть хотя бы один из следующих недостатков:

  • Отработанная память между блоками.
  • Сложное распределение памяти при запуске.

Итак, toolchain пытается выделить все глобальные переменные в одном смежном блоке памяти.

licensed under cc by-sa 3.0 with attribution.