C 包含动态分配数组的结构中的Segfault

C 包含动态分配数组的结构中的Segfault,c,data-structures,C,Data Structures,数据结构vehicle\u array\t有时在添加新的vehicle\u t时会出现故障 我尝试过以不同的顺序插入和删除内容,但这可能是一个边缘案例,我不知道如何复制 结构的定义车辆数组\u t: typedef结构{ 整数大小; 使用int; 车辆*车辆; }车辆阵列; 用于添加到阵列的代码: void添加车辆(车辆数组*数组,车辆) { 如果(数组->使用==数组->大小) { 数组->大小*=2; 数组->车辆=(车辆*)realloc(数组->车辆,数组->大小*车辆大小)); }

数据结构
vehicle\u array\t
有时在添加新的
vehicle\u t
时会出现故障

我尝试过以不同的顺序插入和删除内容,但这可能是一个边缘案例,我不知道如何复制

结构的定义
车辆数组\u t

typedef结构{
整数大小;
使用int;
车辆*车辆;
}车辆阵列;
用于添加到阵列的代码:

void添加车辆(车辆数组*数组,车辆)
{
如果(数组->使用==数组->大小)
{
数组->大小*=2;
数组->车辆=(车辆*)realloc(数组->车辆,数组->大小*车辆大小));
}
阵列->车辆[阵列->使用]=车辆;
数组->已用++;
}

添加新的
车辆时,代码应适当调整阵列大小,但奇怪的是,它有时会出现故障。仅从查看代码来看,我看不出代码有任何问题。

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

vehicle\u array\t
成员是如何初始化的?除了不检查
realloc
是否失败(以及是否覆盖了指针->内存泄漏),我没有发现任何明显的错误。如果
realloc
失败,建议使用@MFisherKDX,这不仅仅是内存泄漏。。。它将在下一行出现故障,因为
array
isNULL@4386427--是的。捕捉得好。
车辆
阵列最初是如何分配的
realloc
假定指针最初分配了
malloc
calloc
realloc
。它不可能在堆栈上。请出示您的。谢谢您的帮助!realloc会失败有什么特别的原因吗?对于C语言来说,我是相当新的,我通常使用C++,所以使用ReLoCo对我来说是新的。@无意义代码,它意味着“没有内存可用”,因此不可能重新分配数据。如果没有足够的代码来重现这个问题,那么它现在不是一个MCVE。重写问题以提供信息是通过使其成为MCVE来完成的。仅仅在“所有相关代码”中转储不是MCVE。长话短说,您需要调试这个。调试后,我意识到问题源于
数组->大小*=2
行。我有另一个从数组中删除的函数,因此数组的大小可能为0。然后,当调用
realloc
时,它被要求分配0个字节并抛出一个错误。祝您调试成功!