使用realloc扩容Article结构体数组报corrupted size vs. prev_size错误如何解决
问题原因与解决方案
你遇到的报错核心问题全部出在AddArt函数的实现逻辑上:
- 第一个严重错误:
realloc扩容时传入的大小错误。你当前传入的是*nbart * sizeof(Article),和原有数组的大小完全一致,根本没有完成扩容操作。后续执行tart[*nbart] = l时直接越界访问了数组后的非法内存,破坏了堆内存的结构。正确的扩容大小应为(*nbart + 1) * sizeof(Article),需要多预留1个新元素的存储空间。 - 第二个严重错误:手动释放了
realloc传入的旧指针。realloc执行成功时会自动释放旧的内存块,你后续额外执行free(tart)属于双重释放操作,是触发corrupted size vs. prev_size报错的直接原因。 - 第三个安全隐患:未判断
realloc的返回值。如果realloc申请内存失败会返回NULL,直接赋值会导致原数组指针丢失,造成内存泄漏。
修正后的AddArt函数代码
Article * AddArt(Article l,Article *tart,int *nbart) { // 按新的元素个数申请内存 Article *aux = realloc(tart, (*nbart + 1) * sizeof(Article)); if(aux == NULL) { printf("内存扩容失败\n"); free(tart); exit(1); } tart = aux; // 写入新元素 tart[*nbart] = l; *nbart += 1; return tart; }
其他注意事项
- 读取
ref字段的scanf没有限制输入长度,你的ref数组长度只有6,最多只能存储5个可见字符加末尾的'\0',建议修改为scanf("%5s", l.ref),避免输入过长导致缓冲区溢出。 - 调用
fopen打开文件后建议增加判空逻辑,避免文件不存在或权限不足时程序逻辑异常。
内容的提问来源于stack exchange,提问作者Zipen
相关产品推荐
相关产品推荐

