Segfault в структуре, содержащей динамически распределенный массив - PullRequest
4 голосов
/ 30 марта 2019

Структура данных vehicle_array_t иногда происходит сбой при добавлении нового vehicle_t.

Я пытался вставлять и удалять объекты в разных порядках, но это может быть крайний случай, который я не знаюо том, как реплицировать.

Определение структуры vehicle_array_t:

typedef struct {
    int size;
    int used;
    vehicle_t *vehicles;
} vehicle_array_t;

Код, используемый для добавления в массив:

void add_vehicle(vehicle_array_t *array, vehicle_t vehicle)
{
    if (array->used == array->size)
    {
        array->size *= 2;
        array->vehicles = (vehicle_t*)realloc(array->vehicles, array->size * sizeof(vehicle_t));
    }

    array->vehicles[array->used] = vehicle;
    array->used++;
}

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

1 Ответ

2 голосов
/ 30 марта 2019

Существует один способ, с помощью которого опубликованный код может вызвать ошибку, а именно, если realloc завершится неудачно (и, следовательно, вернет NULL).Вы не должны realloc непосредственно в указатель данных - всегда используйте временную переменную.

Ваш код должен быть:

void add_vehicle(vehicle_array_t *array, vehicle_t vehicle)
{
    if (array->used == array->size)
    {
        array->size *= 2;
        vehicle_t *tmp = (vehicle_t*)realloc(array->vehicles, array->size * sizeof(vehicle_t));
        if (tmp == NULL)
        {
            //realloc error
            // add error handling here... or just exit
            exit(1);
        }
        array->vehicles = tmp;
    }

    array->vehicles[array->used] = vehicle;
    array->used++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...