C语言指针数组调用realloc失败第五次迭代崩溃问题求助
问题原因
- 核心错误是
realloc传入的内存大小计算错误:realloc第二个参数要求的是总字节数,但你的代码直接传入了元素个数++size,没有乘以单个指针元素的占用字节数。 - 崩溃触发时机的逻辑:32位系统下指针大小为4字节,64位下为8字节。以32位环境为例,前4次迭代分别申请1、2、3、4字节的内存,前3次分配的内存都小于指针的4字节大小,写入指针时会越界破坏堆区的管理元数据,等到第5次调用
realloc时,堆管理器检测到元数据被损坏,就抛出invalid next size错误。
修复方案
把realloc调用行修改为计算总字节数即可:
data = realloc(data, ++size * sizeof(*data));
建议补充异常判断和内存释放逻辑,避免空指针解引用和内存泄漏,完整修复代码如下:
#include <stdlib.h> #include <stdio.h> int main() { int **data = NULL; size_t size = 0; for (size_t i = 0; i < 10; ++i) { printf("begin iteration #%lu...\n", i + 1); int *a = malloc(sizeof *a); if (!a) { perror("malloc failed"); break; } // 临时变量接收realloc返回值,避免分配失败时原指针被覆盖导致泄漏 int **temp = realloc(data, (size + 1) * sizeof(*data)); if (!temp) { perror("realloc failed"); free(a); break; } data = temp; size++; data[size - 1] = a; } // 释放已申请的内存 for (size_t i = 0; i < size; ++i) { free(data[i]); } free(data); return 0; }
补充说明
- 计算内存大小使用
sizeof(*data)而非硬编码sizeof(int*)的写法兼容性更好,后续如果修改data的指针类型,不需要同步修改分配大小的计算逻辑。
内容的提问来源于stack exchange,提问作者octowaddle
相关产品推荐
相关产品推荐

