Char ** продолжает перезаписываться при добавлении в него рекурсивлей - PullRequest
0 голосов
/ 26 марта 2020

У меня есть код, который должен принимать файлы в каталоге, помещать их в строковый массив и распечатывать содержимое. В настоящее время в моем файле Functions. c он успешно записывает в правильный индекс массива, но перезаписывается при записи в следующий индекс массива. Любая помощь приветствуется.

Main. 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;
}

Headers.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 Ответ

0 голосов
/ 26 марта 2020

С это readdir ссылка :

Возвращенный указатель и указатели в структуре могут быть недействительными или структура или области хранения могут быть перезаписаны последующий вызов readdir() в том же потоке каталогов.

Это предложение говорит о том, что readdir может возвращать указатель на одну и ту же структуру снова и снова, а это означает, что * Элемент 1012 * будет одинаковым каждый раз.

Поэтому, когда вы делаете

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

, вы делаете все элементы в массиве указывающими на одну и ту же память.

Решение состоит в том, чтобы дублировать строку d_name, как, например,

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

Конечно, как только вы закончите, вам нужно free каждая строка в массив.

...