分享
三行代码  ›  专栏  ›  技术社区  ›  001brandon

当recursivley添加到Char**时,它会被覆盖

  •  0
  • 001brandon  · 技术社区  · 2 天前

    主c

    #include "Headers.h"
    
    
        void main(){
            listFiles("C:/Users/me/Documents/testDoc");
            //printf("%s",fileArray[0]);
            printf("End");
            return;
        }
    

    函数.c

    #include "Headers.h"
    
    
    void listFiles(const char *foldername){
        struct dirent *dp; //creates object of struct dirent
        DIR *dir=opendir(foldername); //creates object of directory
        char **fileArray=(char **)calloc(1,sizeof(char *));
        if (!dir) //checks to see if directory exsists
            return;
        int numloops=1;
        while ((dp = readdir(dir)) != NULL)//recursivley goes through list
        {
            printf("%d\n",numloops);
            if(numloops==1){
                fileArray[0]=dp->d_name; //maps first file to position zero
                printf("%s test\n",fileArray[0]);
            }
            else{
                fileArray=realloc(fileArray,numloops*sizeof(char *));
                fileArray[numloops-1]=dp->d_name; //maps next file in order to position -1 to make enough memory since array starts at 0
                printf("%s test\n",fileArray[numloops-1]);
            }
    
            numloops++;
            printf("%s original\n", dp->d_name);//maps d_name recursivley
        }
        // Close directory stream
        printf("Value at index 2 %s\n",fileArray[2]);
        printf("Value at index 3 %s\n",fileArray[3]);
        closedir(dir);
        return;
    }
    

    标题.h

    #include <stdio.h>
    #include <stdlib.h>
    #include <dirent.h>
    void listFiles(const char *foldername);
    

    输出

    1
    . test
    . original
    2
    .. test
    .. original
    3
    Doc 1.txt test
    Doc 1.txt original
    4
    Doc 2.txt test
    Doc 2.txt original
    5
    Doc 3.txt test
    Doc 3.txt original
    Value at index 2 Doc 3.txt
    Value at index 3 Doc 3.txt
    End
    

    1
    . test
    . original
    2
    .. test
    .. original
    3
    Doc 1.txt test
    Doc 1.txt original
    4
    Doc 2.txt test
    Doc 2.txt original
    5
    Doc 3.txt test
    Doc 3.txt original
    Value at index 2 Doc 1.txt
    Value at index 3 Doc 2.txt
    End
    
    1 回复  |  直到 2 天前
        1
  •  -1
  •   Some programmer dude    2 天前

    this readdir reference :

    返回的指针和结构中的指针可能会失效,或者结构或存储区域可能会被 readdir()

    那句话的意思是 读取目录 可以反复返回指向同一结构的指针,这意味着 d_name 成员每次都是一样的。

    所以当你这么做的时候

    fileArray[numloops-1]=dp->d_name;
    

    使数组中的所有元素指向完全相同的内存。

    复制 姓名

    fileArray[numloops-1]=strdup(dp->d_name);
    

    当然,一旦你完成了你需要 free 数组中的每个字符串。