«Сколько места в памяти занимает массив, если объявленный максимальный размер не используется?» - PullRequest
2 голосов
/ 26 июня 2019

Если я объявлю массив размером 20 и число значений, которое я дам, будет 9, то будет ли массив занимать в памяти всего 20 размерных пространств или он будет занимать только 9?

Ответы [ 4 ]

3 голосов
/ 26 июня 2019

Насколько вам известно, это будет 20.

Правило как-будто позволяет ему быть меньше 20 или даже компилироваться, хотя я незнать о компиляторе, который использовал бы первый, даже если к элементам массива обращались только с помощью оцениваемой индексации во время компиляции.

Обратите внимание, что sizeof array / sizeof element должен будет возвращать 20, что еще больше усложняет ситуацию.

2 голосов
/ 26 июня 2019

Занимает 20.

Компилятор выделит объем памяти массива (здесь 20) во время компиляции, и эта память не может использоваться другими структурами данных. Независимо от того, сколько памяти вы фактически используете (здесь 9), все 20 блоки будут «зарезервированы» для массива.

1 голос
/ 26 июня 2019

Если это не VLA , размер массива является постоянной времени компиляции, поэтому не имеет значения, сколько памяти вы на самом деле используете , он будет занимать объем памяти такой же, как размер массива, указанный во время определения.

Другими словами, массив, определенный как

 int arr[20] = {0};

собирается занять память размером 20 int элементов, то есть размер массива будет int [20].

Вы можете проверить размер, занятый запуском

 int arr[20] = {0};
 printf ("size of the array: %zu", sizeof (arr));
0 голосов
/ 26 июня 2019

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

Вы можете использовать функции семейства malloc, выделяющие память указателям, которые можно использовать так же, как массивы (но, например, вы не можете использовать метод sizeof для определения его размера)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...