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个字节并抛出一个错误。祝您调试成功!