Установка массива на одно значение

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

Ответы

Ответ 1

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

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

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

Ответ 3

Если это массив байтовых значений или вы хотите установить каждый байт на определенное значение, вы можете использовать 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) он на реальный массив позже.

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 (это не сэндвич), который "ссылался на любую большую копию битового поля или операцию перемещения".

Ответ 4

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

Ответ 5

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

Я предполагаю, что компьютер должен перебирать каждое значение тем или иным способом. Так почему бы не использовать цикл 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++;}