首页 > 解决方案 > 使用 realloc 进行分配

问题描述

我正在尝试列出特定目录的子目录文件。但是,我收到错误“realloc(): invalid next size”。我正在使用 realloc(),因为进一步,我将对数组进行排序(按时间修改,按 lex ...)

    DIR *dir2=NULL; 
    DIR *dir1; 
    struct dirent *sd;     
    struct dirent *ptr; 
    char **arr2=malloc(sizeof(char *)); 
    int size=0; 

    dir1=opendir(directory);  //current dir 
    while((sd=readdir(dir1))!=NULL) 
    { 
        if(sd->d_type==DT_DIR){  //checking,is it a dir? 
            dir2=opendir(sd->d_name);  //parent dir 
            printf("\n./%s\n",sd->d_name);  //printing parent directory's name 

            while((ptr=readdir(dir2))!=NULL){ 
                if(size>0){ 
                    arr2=realloc(arr2,(size)*sizeof(char*)); 
                    arr2[size]=malloc(50); 
                } 
                arr2[size]=ptr->d_name; 
                size++; 
            } 

            for(int i=0;i<size;i++) 
            { 
                printf("%s ",arr2[i]);  //listing files and directories. 
            }      
        } 
    } 

是的,你在我的代码中看不到 free(),在我的真实代码中我正在做 free(),所以问题出在 realloc 中(我猜)。

标签: cmemorydirectoryrealloc

解决方案


int size=0; 

在程序开始时,您初始化大小等于ZERO.

您的代码第一次到达realloc函数时:

arr2=realloc(arr2,(size)*sizeof(char*));

的值size等于1。所以,现在arr2只为ONE指针分配char *。然后您尝试访问 的第二个值arr2

arr2[size]=malloc(50); // here, size  = 1

您必须将 malloc 函数更改为:

arr2=realloc(arr2,(size+1)*sizeof(char*));

malloc检查orrealloc函数的返回值更安全。因为有时候,它会失败,然后让你的程序运行得不好。


推荐阅读