Инициализированный массив со значением 0 внутри блока кода
Вот фрагмент
main(){
//
while(){
int b;
scanf("%d",&b);
int arr[b];
}
}
Хорошо, теперь, так как я не знаю точную границу массива, я должен принять в качестве переменной *,используя scanf*. И созданный массив содержит значение мусора. И для этого я должен инициализировать каждый элемент в 0, потому что это то, что я хочу.
Есть ли способ, которым я могу заставить эту вещь работать, без необходимости каждый раз инициализировать внутри цикла?
Спасибо
РЕДАКТИРОВАТЬ Я думаю, я могу использовать calloc для выделения памяти. Будет ли использоваться другая память?
2 ответа
Если вам нужен массив размера во время выполнения, то правильный подход зависит от того, насколько большим будет ваш массив.
Если значение b
может быть большим, тогда объявление его как локального массива может привести к переполнению стека. В этом случае лучшей идеей будет динамическое выделение массива с помощью calloc
, calloc
будет правильно инициализировать ноль int
массив.
Если массив относительно мал и безопасен для размещения в стеке, вы можете просто объявить его как локальный массив (что вы и сделали в исходном коде), а затем установить для него все нули, используя memset(arr, 0, sizeof arr)
,
Конечно, в обоих случаях вы можете получить скрытый цикл обнуления памяти, реализованный внутри библиотечной функции. В общем случае невозможно установить большую область памяти на ноль без использования цикла.
Если ваш компилятор поддерживает C99, вы можете легко использовать VLA;
int a, b;
printf("Enter size of array: ");
scanf("%d",&b);
int arr[b];
и для инициализации всех его элементов в ноль в вашем случае используйте внутренний цикл или стандартную библиотечную функцию memset
,
memset(b, 0, sizeof(b));