运行C语言二维double数组内存管理代码时报free(): invalid pointer错误
问题根因
- 你对
malloc返回的原始指针做了偏移操作,而C标准明确规定free的入参必须是malloc/calloc/realloc返回的原始地址,偏移后的指针传入会直接触发非法指针报错- 行指针数组:
malloc得到原始地址后执行了a -= rows_lower_lim(即偏移了1位),返回给调用方的指针已经不是原始分配地址 - 数据块:给
a[1]分配内存后执行了a[rows_lower_lim] -= cols_lower_lim,同样偏移了1位,a[1]也不是原始分配地址
- 行指针数组:
修复方案
不需要修改分配逻辑,只需调整free_2d_double函数,释放前把指针回退到原始分配地址即可,修正后的代码如下:
void free_2d_double(double **a){ if(a){ // 先回退数据块指针到原始malloc地址再释放 free(a[1] + 1); // 再回退行指针数组指针到原始malloc地址再释放 free(a + 1); } }
修改后原有下标从1开始访问数组的逻辑完全不受影响,也不会再触发free(): invalid pointer报错。
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

