Reallo c in C random int - PullRequest
       69

Reallo c in C random int

0 голосов
/ 07 мая 2020

У меня проблема с перераспределением памяти динамически выделяемого массива. Итак, я пытаюсь сделать следующее:

typedef struct {
    int s;
    int l;
    int* arr;
    bool orient;
}DAC;
...
int main()
{
DAC heap = {
        4, 0, (int*)malloc(4 * sizeof(int))
    };
    char c = 0;
    int n = 0;
    while (1)
    {
        scanf("%c", &c);
        switch (c)
        {
        case '+':
            if (heap.s == heap.l)
            {
                heap.s *= 2;
                heap.arr = (int*)realloc(heap.arr, heap.s);
            }
            scanf("%d\n", &(heap.arr[heap.l]));
            heap.l++;
            break;
        case 'p':
            for (int i = 0; i < heap.l; i++)
                printf("%d ", heap.arr[i]);
            printf("\n");
            break;
        }
    }

}

Пока вся моя структура работает для n <5 (я начинаю с массива размером '4'), при выполнении этого блока происходят странные вещи: </p>

if (heap.s==heap.l)
{
heap.s*=2;
heap.arr=(int*)realloc(heap.arr,heap.s);
}

В чем причина того, что я получаю неправильный вывод в индексе [2] моего массива? Я знаю, что могу сделать это с помощью mallocs, просто интересно, потому что я думаю, что это странный случай

Весь ввод / вывод:

+ 1
+ 2
+ 3
+ 4
p
1 2 3 4
+ 5
p
1 2 -33686019 4 5

1 Ответ

4 голосов
/ 07 мая 2020

Вы начинаете правильно, когда инициализируете heap:

DAC heap = {
        4, 0, (int*)malloc(4 * sizeof(int))
    };

Но когда вы действительно хотите увеличить размер, вы забываете настроить размер целых чисел. Вместо увеличения размера, чтобы соответствовать 8 int значениям, вместо этого вы получаете только 8 байтов.

Как напомнил в комментарии Феликс Джи, вы никогда не должны напрямую назначать один и тот же указатель. Если realloc возвращает NULL, у вас больше нет доступа к старому адресу.

Используйте вместо этого:

            if (heap.s == heap.l)
            {
                heap.s *= 2;
                void *tmp = realloc(heap.arr, heap.s * sizeof(int));
                if (tmp != NULL) {
                    heap.arr = tmp;
                } else {
                    // handle error...
                }
            }
...