C realloc在函数内部

时间:2011-05-11 20:23:20

标签: 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个字符串时,它不会因分段错误而失败。

为什么一直这样做?

提前致谢,对不起我的英语。

1 个答案:

答案 0 :(得分:4)

传入一个char **,一个指向char的指针,该指针表示指向“string”的指针,该字符串表示“字符串数组”。如果你想重新分配那个数组,你必须通过引用传递它(传递一个指向它的指针)所以你需要一个“指针到字符串数组”,或者char ***

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


...
char **data = ...;
myfunc(&data, ...);