结构体数组realloc扩容失败,请求排查代码中的明显错误
问题分析与修复方案
哦,我一眼就发现了你的代码里的核心问题——指针传递的方式错误,导致realloc的结果根本没同步回主函数里的原始指针!
问题根源
当你把fileInfoArr传给enlargeFileInfos函数时,你传递的是指针的副本。函数内部的fileInfoArray只是一个局部变量,和main里的fileInfoArr是两个独立的变量。所以你在函数里执行fileInfoArray = temp,只是修改了这个局部副本的指向,main函数里的原始指针完全没变化。
这就造成了两个严重问题:
- 每次
realloc得到的新内存块地址没有传递回去,main里的指针始终指向最初malloc的那块小内存,等于扩容完全没生效 - 函数里的
temp指向的新内存块会在函数结束后丢失(除了第一次),造成内存泄漏;后续再用旧指针调用realloc,还可能触发未定义行为(比如重复释放已失效的内存)
两种修复方案
方案一:使用二级指针(指针的指针)传递
通过传递指针的地址,让函数能直接修改main里的原始指针:
#include <getopt.h> #include <string.h> #include <stdio.h> #include <stdlib.h> typedef struct fileInfo { char accessRights[12]; short hardLinks; short userName; short groupName; long size; char *time; char *fileName; short nrOfNode; } fileInfo; void enlargeFileInfos(fileInfo **fileInfoArray, int currentSize) { fileInfo *temp = (fileInfo*)realloc(*fileInfoArray, (currentSize + 1) * sizeof(fileInfo)); if (!temp) { printf("realloc --FAILED--\n"); return; } *fileInfoArray = temp; // 修改原始指针的指向 printf("fileInfo grew to %d item(s)\n", currentSize + 1); } int main( ) { size_t nrOfDirs = 1; fileInfo *fileInfoArr = malloc(sizeof(fileInfo)); // 别忘了检查malloc是否成功 if (!fileInfoArr) { printf("malloc --FAILED--\n"); return 1; } for (int i = 0; i < 5; i++) { enlargeFileInfos(&fileInfoArr, nrOfDirs); // 传递指针的地址 nrOfDirs++; } // 记得后续要释放内存哦 free(fileInfoArr); return 0; }
方案二:让函数返回新的指针
让enlargeFileInfos函数返回realloc后的新指针,main函数接收这个返回值来更新原始指针:
#include <getopt.h> #include <string.h> #include <stdio.h> #include <stdlib.h> typedef struct fileInfo { char accessRights[12]; short hardLinks; short userName; short groupName; long size; char *time; char *fileName; short nrOfNode; } fileInfo; fileInfo* enlargeFileInfos(fileInfo *fileInfoArray, int currentSize) { fileInfo *temp = (fileInfo*)realloc(fileInfoArray, (currentSize + 1) * sizeof(fileInfo)); if (!temp) { printf("realloc --FAILED--\n"); return fileInfoArray; // 分配失败时返回原指针,避免丢失内存 } printf("fileInfo grew to %d item(s)\n", currentSize + 1); return temp; } int main( ) { size_t nrOfDirs = 1; fileInfo *fileInfoArr = malloc(sizeof(fileInfo)); if (!fileInfoArr) { printf("malloc --FAILED--\n"); return 1; } for (int i = 0; i < 5; i++) { fileInfoArr = enlargeFileInfos(fileInfoArr, nrOfDirs); // 接收新指针 nrOfDirs++; } free(fileInfoArr); return 0; }
额外提示
- 永远记得检查
malloc和realloc的返回值,避免空指针操作 - 后续使用完结构体数组后,别忘了调用
free释放内存,避免内存泄漏
内容的提问来源于stack exchange,提问作者vanderer
相关产品推荐
相关产品推荐

