Инициализация массива переменной длины до нуля

int x = 750;
int i = 0;

while (pow(2, i) < x) {
    i++;
}
printf("i is currently %d\n", i);

int array[i];

while (i > 0){
    i--;
    printf("The value of array %d is %d\n", i, array[i]);
}

Когда я это делаю, это создает действительно сумасшедшие значения. Я слышал о попытках использовать malloc или memset, но значения не изменились. Все, что я хочу сделать, это установить все это на ноль, чтобы я мог использовать его в качестве счетчика. Спасибо!


person Farion    schedule 05.06.2014    source источник
comment
Как, точно, это memset, которое вы пробовали, выглядело, когда значения не изменились? Опубликуйте это, пожалуйста. Мой хрустальный шар говорит мне, что вы вызвали memset(array, 0, i), хотя должны были вызвать memset(array, 0, i*sizeof(*array));.   -  person WhozCraig    schedule 05.06.2014
comment
Эй, спасибо, Крейг, это правда, а я даже не понял. Мне нужно будет переработать это. Хорошо, также я попробовал memset(array, 1, i*sizeof(*array));, и он показывает все значения как 16843009.   -  person Farion    schedule 05.06.2014
comment
Вы хотите их один или ноль? Помните, что memset устанавливает октеты; не объекты. Установка каждого байта в 1 в последовательности 4-байтовых целых чисел дает 0x01010101 для каждого int, что в десятичном виде равно 16843009. Если вы хотите, чтобы все они изначально были 1, вы нужно сделать это через жесткий цикл. for (int j=0; j<i; array[j++] = 1); или что-то подобное.   -  person WhozCraig    schedule 05.06.2014
comment
Цикл for в конце — это именно то, что мне было нужно. Я не понимал, что могу воткнуть array[j++] в прилавок. Большое спасибо, это очень полезно!   -  person Farion    schedule 05.06.2014
comment
Пока вы исправляете это, вы также можете исправить дорогостоящий способ вычисления i. Попробуйте while ((1 << i++) < x);. Версия, которую вы имеете, позволила бы i выйти из цикла как ноль, если бы x был 1. Это было бы плохо, так как привело бы к бесполезному VLA. Я бы также поощрял unsigned int за все это.   -  person WhozCraig    schedule 05.06.2014


Ответы (1)


Вы не инициализировали значения массива. Содержимое его мусор: значения array[i] в вашем printf не определены - может быть что угодно.

Чтобы инициализировать массив равным 0, вы можете использовать memset (как прокомментировал @WhozCraig, memset устанавливает для всех байтов массива заданное значение):

memset (array, 0, sizeof(array));

Чтобы написать что-то еще, напишите цикл for:

 int n = 0;
 for(; n < i ; ++n)
    array[n] = n; 
person quantdev    schedule 05.06.2014
comment
Ради полноты, чтобы инициализировать до 0, int array[i] = { 0 }; непревзойденно для краткости. - person Pascal Cuoq; 05.06.2014
comment
@Pascal, массив OP имеет динамический размер. ошибка: объект переменного размера не может быть инициализирован - person quantdev; 05.06.2014