You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

结构体数组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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:29:41