как инициализировать все элементы массива за один раз, когда определение и объявление разделены? - PullRequest
0 голосов
/ 01 февраля 2011

когда мы пишем что-то вроде этого

int arr[5] = 0; или int arr[5] = {0};

нет проблем

но когда мы делаем что-то подобное

int arr[5];
arr[5] = {0};

ошибка происходит. Любое объяснение этому?

Ответы [ 5 ]

3 голосов
/ 01 февраля 2011

Это просто часть определения языка, что массивы могут быть инициализированы, но не назначены напрямую. Вы можете делать то, что вы хотите в C99, используя memcpy() с составным литералом:

int arr[5];

/* ... */

memcpy(&arr, &(int [5]){ 0 }, sizeof arr);

С расширением GCC typeof вы можете добавить немного больше безопасности:

memcpy(&arr, &(typeof(arr)){ 0 }, sizeof arr);

В C89 вы должны дать исходному массиву имя:

{ static const int zero[5] = { 0 }; memcpy(&arr, &zero, sizeof arr); }
2 голосов
/ 01 февраля 2011

Во время определения вы можете сделать это назначение.

Однако arr [5] означает попытку присвоить значение 5-му индексу, и он ожидает одно целое значение, а не значения внутри фигурных скобок, чтобы указать инициализацию массива.

0 голосов
/ 01 февраля 2011

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

{} называется списком инициализатора.Списки инициализатора могут только находиться в той же строке, что и объявление переменной, и все элементы в списке должны быть константами (при условии стандарта C90).Они могут использоваться для инициализации обоих массивов или структур (также называемых «агрегатами»), к обоим применяются одни и те же правила.

int arr [5] = {0};

Что это делает подробно, должен установить первый элемент с индексом [0] на ноль.Остальные выпуски инициализируются в соответствии с правилом, которое гласит, что если в списке инициализатора задано только несколько элементов, то элементы, которые не были явно инициализированы программистом, должны быть установлены в ноль компилятором (ISO 9899: 1999 6.7.8 §19).

Таким образом, приведенная выше строка устанавливает arr [0] в ноль, а затем компилятор устанавливает остальные элементы, arr [1] в arr [4], в ноль.Если бы вы написали

int arr [5] = {1};

, тогда элементы массива были бы инициализированы в {1, 0, 0, 0, 0}.

0 голосов
/ 01 февраля 2011

Синтаксис C таков, что только arr распадается на &a[0], адрес первого элемента, почти во всех контекстах.Таким образом, синтаксис, который был бы естествен для назначения массивам arr = { ... };, не может работать.Поэтому никакое присвоение массиву в целом невозможно.

Синтаксис int a[5] = { 0 }; - это инициализация, и это работает, поскольку он инициализирует все элементы с 0.Лучшее, что вы можете сделать, - это всегда инициализировать массивы с помощью этого инициализатора «catch all», чтобы все элементы находились в известном состоянии.Затем, если позже в вашей программе вы решите, что хотите использовать другие значения, присвойте их напрямую.

0 голосов
/ 01 февраля 2011

int arr [5] означает массив целых чисел с местом для хранения 5 значений, имеющих индекс 0,1,2,3,4.теперь arr [5] не будет указывать ни на один элемент в этом массиве.

u может использовать

arr [] = {0,0,0,0,0}, зная, что есть 5элементы в вашем массиве.

или может быть memset () может помочь вам.

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