Установка массива в одно значение - PullRequest
16 голосов
/ 01 ноября 2010

Есть ли в C более простой способ установить массив в одно значение, чем использование цикла for и установка каждого значения по одному?

Ответы [ 5 ]

20 голосов
/ 01 ноября 2010

Если вы устанавливаете для массива все 0 или если массив представляет собой массив байтов, вы можете использовать memset

// Set myArray to all 0's
memset(myArray, 0, numberOfElementsInMyArray * sizeof(myArray[0]));

Если вам нужно установитьзначение, отличное от 0 в единицах, превышающих байт (например, установите массив из int s в 1), тогда для этого не существует стандартной функции - для этого вам придется написать собственный цикл for.

9 голосов
/ 01 ноября 2010

Вы можете установить его на то же значение, но только на 0

Как инициализировать все элементы массива одним и тем же значением?

инициализировать все элементы 0:

int myArray[10] = { 0 }; // all elements 0

На этой странице также есть ответ для gcc.

5 голосов
/ 01 ноября 2010

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

char xyzzy[100];
int plugh[40];
memset (xyzzy, 7, sizeof (xyzzy)); // all chars set to 7.
memset (plugh, 0x42, sizeof (plugh));  // all integers set to (e.g.) 0x42424242.

Другая возможность - создать шаблон правильного размера.во время инициализации (либо реальной инициализации, как указано ниже, либо в функции init), затем вызовите memcpy до blat (a) в реальный массив позжеdate.

static int template[] = { 1, 1, 1, 1, 1 };
int zorkmid[3];
memcpy (zorkmid, template, sizeof (zorkmid)); // ensure template is at
                                              // least as big as zorkmid.

Этот последний метод также удобен для заполнения структур с фиксированным предварительно вычисленным значением: инициализируйте фиктивную копию с установленными обязательными полями, а затем memcpy вместо ручной установки всех полей каждыйраз вы хотите новый экземпляр.


(a) В стороне: этимология blat:

ЖаргонВ файле (см. глоссарий для всех определений) перечислены blat в виде четырех метасинтаксической переменной {foo, bar, thud, blat} или синонима blast, смысл 1.

В свою очередь, blast (смысл 1) определяется как синоним BLT (это , а не сэндвич), который "относится к любой операции копирования или перемещения большого битового поля".

3 голосов
/ 01 ноября 2010

Зависит от значения.Если это ноль, используйте memset(a, 0, sizeof(a)).В противном случае, если это массив символов, вы можете использовать memset с другим значением.Но memset всегда работает на уровне char, поэтому, если ваш массив не char, вероятно, будет иметь значение только ноль.

0 голосов
/ 09 октября 2018

Это старые вопросы, но вот мои два цента.

Я полагаю, что компьютер должен перебирать каждое значение так или иначе. Так почему бы не использовать цикл for внутри макроса? Таким образом, ваш код не загромождается, и вы получаете что-то вроде функции.

Для массивов, выделенных стеком (с определенным размером во время компиляции):

#define fill_array(array, value) \
    for(int i; i < sizeof(array)/sizeof(array[0]); i++) \
    {array[i]=value;}

Для массивов, распределенных по куче (iter - указатель на первую запись массива):

#define fill_array(iter, length, value) \
    for(int i; i < length; i++) \
    {*iter=value; iter++;}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...