包含动态分配数组的结构中的段错误

时间:2019-03-30 20:43:46

标签: c data-structures

数据结构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 个答案:

答案 0 :(得分:2)

有一种方法可以发布的代码进行段错误,即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++;
}