Установка массива на одно значение
Есть ли более простой способ в C
установить массив на одно значение, чем использовать цикл for
и переходить каждый раз по одному значение?
Ответы
Ответ 1
Если вы задаете массив всем 0, или массив представляет собой массив байтов, вы можете использовать memset
// Set myArray to all 0's
memset(myArray, 0, numberOfElementsInMyArray * sizeof(myArray[0]));
Если вам нужно установить его на что-то отличное от 0 в единицах больше байта (например, установите массив из int
в 1), тогда нет стандартной функции для этого - вам придется писать ваш собственный цикл для этого.
Ответ 2
Вы можете установить его с тем же значением, но только с 0
Как инициализировать все элементы массива с одинаковым значением?
инициализируйте все элементы 0
:
int myArray[10] = { 0 }; // all elements 0
На этой странице также есть ответ для gcc.
Ответ 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++;}