C语言出现munmap_chunk(): invalid pointer错误及signal 6崩溃问题
报错原因与修复方案
munmap_chunk(): invalid pointer 及信号6(SIGABRT)错误均为堆内存操作异常导致,该场景下常见错误原因如下:
- 给
Data结构体的array赋值了栈内存地址,测试用例后续释放array时触发非法释放 - 申请的
array数组长度不足,写入数据时越界破坏了堆内存元数据 - 返回的
Data结构体本身是栈内变量,函数返回后栈地址失效,访问时触发异常
正确实现代码
#include <stdlib.h> #include <string.h> #include <stdio.h> typedef struct Data Data; struct Data { int *array; int sz; }; Data* sqInRect(int lng, int wdth) { // 申请Data结构体堆内存 Data *res = (Data*)malloc(sizeof(Data)); // 处理长宽相等的边界情况 if (lng == wdth) { res->sz = 0; res->array = NULL; return res; } // 先计算需要的数组长度 int a = lng, b = wdth; int len = 0; while (a != b) { if (a < b) { int tmp = a; a = b; b = tmp; } len++; a -= b; } len++; // 计入最后剩余的正方形 // 申请结果数组内存 res->array = (int*)malloc(sizeof(int) * len); res->sz = len; // 填充数组内容 a = lng; b = wdth; int idx = 0; while (a != b) { if (a < b) { int tmp = a; a = b; b = tmp; } res->array[idx++] = b; a -= b; } res->array[idx] = b; return res; }
注意事项
- 所有需要返回的结构体、数组都必须使用
malloc申请堆内存,不能使用栈上的临时变量 - 测试用例会负责释放返回的
array和Data结构体本身,不需要在函数内执行释放操作
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

