Инициализированный массив со значением 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));
Другие вопросы по тегам