c - 包含动态分配数组的结构中的段错误
问题描述
数据结构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
添加一个新的时,代码应该适当地调整数组的大小,但奇怪的是,它有时会出现段错误。我看不到代码有任何问题。
解决方案
发布的代码有一种可能出现段错误的方法,那就是如果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++;
}
推荐阅读
- parsing - Is this double constraint syntax from PKCS#9 legal?
- python - 如何添加具有未知键数的字典系列
- c# - 在 C# 中迭代临时字符串列表的最佳实践
- node.js - mongoDB takes 1.04 sec for a simple find request with node,js
- java - 使用类的常量值初始化通用 HashMap
- algorithm - subdivide rectangle with specific rules
- javascript - 在前端 javascript 中将 .ttf 或 .otf 转换为 .woff
- javascript - Why is my my prompt for a user name failing while trying to create a system to generate a random code with user initials?
- c# - Can I run two TestServers on one environment, with different configs?
- arrays - MS Access VBA 循环停止,没有错误或明显原因