结构体数组内指针赋值导致程序无限挂起的原因排查
问题排查与解决思路
核心问题分析
编译通过但运行时无限挂起,大概率是野指针非法访问或数组越界引发的内存踩踏导致——C/C++中这类内存问题常表现为无明显报错的运行异常。
常见错误点排查
1. 指针数组初始化问题
检查polygon_buffer的内存分配与初始化:
- 静态数组场景:确保数组大小足够,且逐个初始化指针为
NULL,避免野指针:#define MAX_POLYGONS 100 screenDrawInfo* polygon_buffer[MAX_POLYGONS]; // 初始化数组内所有指针 for (int i = 0; i < MAX_POLYGONS; i++) { polygon_buffer[i] = NULL; } - 动态数组场景:确认
malloc/calloc分配成功,避免空指针:screenDrawInfo** polygon_buffer = (screenDrawInfo**)malloc(sizeof(screenDrawInfo*) * MAX_POLYGONS); if (!polygon_buffer) { // 处理内存分配失败逻辑 }
2. rectangle指针赋值逻辑错误
给polygon_buffer[i]->rectangle赋值时,必须保证:
- 先为
screenDrawInfo结构体本身分配内存,再为rectangle指针分配对应大小的float内存:// 假设rectangle存储4个float(x1,y1,x2,y2) polygon_buffer[i] = (screenDrawInfo*)malloc(sizeof(screenDrawInfo)); polygon_buffer[i]->rectangle = (float*)malloc(sizeof(float) * 4); // 再进行赋值操作 polygon_buffer[i]->rectangle[0] = 100.0f; polygon_buffer[i]->rectangle[1] = 200.0f; - 禁止将
rectangle指向栈上临时变量(栈变量销毁后会变为野指针)。
3. 数组越界检查
确认访问polygon_buffer的索引未超出数组范围,循环条件错误会导致死循环+越界访问:
// 错误示例:循环条件用了<=导致越界 for (int i = 0; i <= MAX_POLYGONS; i++) { // 应改为i < MAX_POLYGONS polygon_buffer[i]->rectangle = ...; }
调试建议(针对最小复现示例)
- 打印关键地址:输出
polygon_buffer、polygon_buffer[i]、polygon_buffer[i]->rectangle的地址,验证是否为有效内存地址。 - 使用调试器:用GDB等工具在赋值语句处设断点,逐步执行观察内存变化,定位非法访问的触发点。
- 检查内存管理:确认是否存在重复释放或未释放的内存,这类问题可能间接导致程序挂起。
代码规范建议
- 所有指针使用前必须初始化,要么指向合法内存,要么设为
NULL。 - 动态分配的内存需成对释放,避免内存泄漏:
for (int i = 0; i < MAX_POLYGONS; i++) { if (polygon_buffer[i]) { free(polygon_buffer[i]->rectangle); free(polygon_buffer[i]); } } free(polygon_buffer); - 用宏定义或常量指定数组大小,减少硬编码带来的越界风险。
内容的提问来源于stack exchange,提问作者modlegend
相关产品推荐
相关产品推荐

