2013-07-14 3 views
0

Вот фрагментинициализируется массив значение 0 внутри блока кода

main(){ 
// 
    while(){ 
    int b; 
    scanf("%d",&b); 
    int arr[b]; 
    } 
} 

Хорошо, теперь, Так как я не знаю точную границу массива, я должен взять в качестве переменной * с помощью зсапЕ *. И созданный массив содержит значение мусора. И для этого я должен инициализировать каждый элемент до 0, потому что это то, что я хочу.

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

Благодаря

EDIT Я предполагаю, что я могу использовать calloc для выделения памяти. Будет ли другая используемая память?

+0

@PHI основатель gcc принимает его без ошибок. – Kraken

+0

Размер массива должен быть определен. – 0decimal0

+0

Компиляция с -Wall ... как 'gcc -Wall prog.c -pedantic -o prog'. – 0decimal0

ответ

4

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

Если значение b может быть большим, то объявление его как локального массива может привести к переполнению стека. В этом случае лучшей идеей было бы динамическое распределение массива с помощью calloc. calloc будет правильно нулевым инициализировать массив int.

Если массив относительно невелик и безопасен для размещения в стеке, вы можете просто объявить его как локальный массив (это то, что вы сделали в исходном коде), а затем установить его на все нули, используя memset(arr, 0, sizeof arr) ,

Конечно, в обоих случаях вы можете получить скрытый цикл обнуления памяти, реализованный внутри библиотечной функции. В общем случае невозможно установить большую область памяти в ноль без использования цикла.

+0

+1 для включения случая большой буквы 'b'. – 0decimal0

1

Если ваш компилятор поддерживает C99, вы можете легко использовать VLA;

int a, b; 
printf("Enter size of array: "); 
scanf("%d",&b); 

int arr[b]; 

и инициализировать все элементы к нулю в вашем случае использовать внутренний контур или стандартную библиотечную функцию memset.

memset(b, 0, sizeof(b)); 
+0

AAhhhhhhh ....... Я сказал, что уже в моем комментарии ..... в любом случае: P – 0decimal0

+1

@PHIfounder Да, но ваш комментарий сразу после моего :) – haccks

+1

Разве это не то, что делает OP? – AnT