Можно ли предположить, что двумерные массивы правильно инициализируются, как это? - PullRequest
1 голос
/ 16 февраля 2010

Когда я объявляю двумерный массив следующим образом:

char myArray[20][30] = {"ABC", "Is Easy As One Two Three"};

Могу ли я предположить, что все другие символы в этом массиве теперь установлены на \000?

1 Ответ

1 голос
/ 17 февраля 2010

Объекты никогда не инициализируются частично в C - если вы использовали инициализатор, тогда весь объект гарантированно инициализируется (в этом случае «объект» - это целый массив из 20 массивов по 30 символов в каждом). Все члены, которые не были явно инициализированы, рекурсивно инициализируются в ноль (для арифметических типов) или NULL (для типов указателей).

Таким образом, ответ, в этом случае, да - все char s, явно не заданные значения инициализатором, гарантированно будут равны 0.

Это описано в стандарте C99 в разделе 6.7.8, Инициализация. Соответствующие пункты:

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

и

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

- если это имеет тип указателя, он инициализируется нулевой указатель;

- если есть арифметика тип, он инициализирован до (положительный или без знака) ноль;

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

- если это союз, первый именованный член инициализирован (рекурсивно) в соответствии с этими правила.

...