Что выделяется в памяти, когда массивы не полностью заполнены? (С) - PullRequest
0 голосов
/ 05 апреля 2019

Я создал такой массив: int thisArray[20] = {0,1,2,3,4,5,6,7,8,9};

Затем я создал переменную для хранения размера массива:

int this = sizeof(thisArray);

Когда я говорю программе напечатать значение this, он показывает 80 вместо 20.

Что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 05 апреля 2019

Когда вы даете инициализатор без явной инициализации всего, все, что не установлено явно, будет установлено равным 0.

Раздел 6.7.9, стр. 21 стандарта C11:

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

А правила статической длительности хранения, указанные здесь, приведены в 6.7.9 p 10

Если объект, имеющий автоматическое время хранения, не является инициализируется явно, его значение не определено. Если объект, который имеет статическое или потоковое время хранения не инициализируется явно, затем:

  • если он имеет тип указателя, он инициализируется нулевым указателем; - если имеет арифметический тип, инициализируется как (положительный или без знака) ноль;
  • если это агрегат, каждый элемент инициализируется (рекурсивно) в соответствии с этими правилами, и любой отступ инициализируется нулевыми битами;
  • если это объединение, первое имя элемент инициализируется (рекурсивно) в соответствии с этими правилами, и любой заполнение инициализируется нулевыми битами;

Что касается того, почему вы получаете 80 вместо 20 для sizeof, потому что int, по-видимому, составляет 4 байта в вашей системе, поэтому 20 * 4 = 80 байтов.

1 голос
/ 05 апреля 2019

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

sizeof соответствует размеру массива в байтах , а не количеству элементов. Вы объявили, что thisArray имеет 20 элементов типа int, и хорошая ставка sizeof (int) в вашей системе - 4. Таким образом, результат sizeof для этого объекта будет 80.

Есть способ получить количество элементов в массиве:

size_t elements = sizeof myArray / sizeof myArray[0];

То есть вы берете общий размер массива (80 байт) и делите его на размер одного элемента (в данном случае 4). Обратите внимание, что этот прием только будет работать, если операнд первого sizeof имеет тип array (то есть объявлен как T arr[N]). Если это тип указатель , это не сработает - вы будете делить размер объекта указателя на размер элемента массива.

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