C realloc внутри функции

Вот мой код:

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>

void mp3files(char** result, int* count, const char* path) {
    struct dirent *entry;
    DIR *dp;

    dp = opendir(path);
    if (dp == NULL) {
        printf("Error, directory or file \"%s\" not found.\n", path);
        return;
    }

    while ((entry = readdir(dp))) {
        if ((result = (char**) realloc(result, sizeof (char*) * ((*count) + 1))) == NULL) {
            printf("error");
                return;
        }

        result[*count] = entry->d_name;
        (*count)++;
    }

    closedir(dp);
}

int main() {

    int* integer = malloc(sizeof (int));
    *integer = 0;

    char** mp3FilesResult = malloc(sizeof (char*));
        mp3files(mp3FilesResult, integer, ".");

    for (int i = 0; i < *integer; i++) {
        printf("ok, count: %d \n", *integer);
        printf("%s\n", mp3FilesResult[i]);
    }

    return (EXIT_SUCCESS);
}

Это дает мне ошибку сегментации. Однако, когда я помещаю этот цикл:

for (int i = 0; i < *integer; i++) {
    printf("ok, count: %d \n", *integer);
    printf("%s\n", mp3FilesResult[i]);
}

в конце функции mp3files это работает. И когда я меняю третий параметр функции mp3files с "." в каталог, который содержит менее 4 файлов или каталогов, он отлично работает. Другими словами, когда переменная mp3FilesResult указывает менее чем на 4 строки, это не приводит к ошибке сегментации.

Почему оно продолжает это делать?

Заранее спасибо и извините за мой английский.


person VaclavDedik    schedule 11.05.2011    source источник


Ответы (1)


Вы передаете char **, указатель на указатель на char, который представляет указатель на «строку», которая представляет «массив строк». Если вы хотите перераспределить этот массив, вы должны передать его по ссылке (передать указатель на него), поэтому вам нужен «указатель на массив строк» ​​или char ***:

... myfunc(char ***result, ...)
{
    *result = realloc(*result, ...); // writing *result changes caller's pointer
}


...
char **data = ...;
myfunc(&data, ...);
person Ben Jackson    schedule 11.05.2011
comment
Назначьте результат realloc временной переменной-указателю. Если вызов realloc завершится ошибкой и вернет NULL, вы рискуете потерять след своего блока памяти, что приведет к утечке памяти. - person John Bode; 12.05.2011