Возникли проблемы при добавлении элементов в массив и их печати

#c #arrays #printing

#c #массивы #печать

Вопрос:

Я пытаюсь создать массив, размер которого зависит от количества входных элементов. После этого я хочу распечатать его, но получаю очень странные результаты.

 int main(void)
{
    int input_arr;
    int i,size=0;
    int arr[size];

    while(input_arr!=-1){
        printf("enter positive int");
        scanf("%d",amp;input_arr);

        arr[size]=input_arr;
        printf("%d",arr[size]);

        for(i=0;arr[i]!='';i  ){
            printf("%d ",arr[i]);
        }

        size =1;
    }
    return 0;
}
 

33 3 3 3 3 3 6487488 enter positive int3.

Он выдает такой вывод, и через некоторое время он перестает принимать элементы. Я не мог распознать, где я делаю неправильно.

Комментарии:

1. вы объявили массив размером 0. Я больше разбираюсь в c , но я думаю, что размер вашего массива фиксирован на момент его объявления, когда size равен 0. (предположительно, вы вводите UB, когда начинаете писать после конца)

2. вы правы, но это не решило мою проблему. теперь я получаю вывод, подобный 4202816 1 37, после того, как я поместил первый элемент. Возможно, указатели могут мне помочь, но сначала я хочу знать, почему это не работает и как я могу это исправить.

3. Каков ваш желаемый результат? Чего вы пытаетесь достичь?

4. Этот код по-прежнему показывает, что вы объявляете массив размером 0 и пишете после конца. Неопределенное поведение. (Пожалуйста, укажите точный ввод, вывод и ожидаемый результат)

Ответ №1:

В C размер массива фиксируется в тот момент, когда вы его определяете. Увеличение size переменной не увеличивает размер массива. Поэтому вы сразу получаете переполнение буфера в тот момент, когда вы читаете первый элемент. Вместо этого вы можете объявить большой массив следующим образом:

 static const int maxSize = 4096;
int arr[maxSize];

int main(void)
{
    int i, size=0;

    while(size < maxSize){
        printf("enter positive int");
        scanf("%d", amp;arr[size]);
          size;

        for(i=0; i < size; i  ){
            printf("%d ",arr[i]);
        }
        printf("n");
    }
    return 0;
}
 

В качестве альтернативы вы можете использовать malloc и realloc для динамического увеличения массива.