首页 > 解决方案 > 包含动态分配数组的结构中的段错误

问题描述

数据结构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添加一个新的时,代码应该适当地调整数组的大小,但奇怪的是,它有时会出现段错误。我看不到代码有任何问题。

标签: cdata-structures

解决方案


发布的代码有一种可能出现段错误的方法,那就是如果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++;
}

推荐阅读