在函数中通过指针修改 char* 会导致崩溃

Modifying a char* by pointer in a function gives a crash

我是 C 的新手,我正在尝试计算动态内存分配以从文件中读取。至少我认为这就是我正在做的。

无论如何,这段代码有效:

int readfromfile(FILE *filepointer)
{
    size_t size = 2;
    char *str = (char *) malloc(sizeof(char));
    int character = 0;
    size_t counter = 0;
    while((character = fgetc(filepointer)) != EOF)
    {
        str = (char *) realloc(str, size);
        str[counter] = (char) character;
        size ++;
        counter++;

    }
    str[counter] = '[=10=]';
    printf("+%s+", str);
    free(str);
    return 0;
}

而这段代码没有:

int main()
{
    char *str = (char *) malloc(sizeof(char));
    ...
    readfromfile(ifpointer, &str);
}

int readfromfile(FILE *filepointer, char **str)
{
    size_t size = 2;
    int character = 0;
    size_t counter = 0;
    while((character = fgetc(filepointer)) != EOF)
    {
        *str = (char *) realloc(*str, size);
        *str[counter] = (char) character;
        size ++;
        counter++;
    }
    str[counter] = '[=11=]';
    printf("+%s+", *str);
    free(str);
    return 0;
}

我不明白为什么,因为据我所知,我每次都将指向 char 数组位置的指针发送给函数并访问数据。编译器没有显示任何错误消息,它只是循环一次,并且在每次 realloc 之后的第二个循环中崩溃。分配给第一个值的字符也是垃圾。

我花了很长时间试图让它发挥作用并进行了大量研究,所以如果我错过了解决方案,我深表歉意,但我真的被困在这一点上。

你崩溃是因为

*str[counter] = (char) character;

相同
*(str[counter]) = (char) character;

相对于

(*str)[counter] = (char) character;

这正是您想要的。阅读 Operator Precedence on Wikipedia。您会发现 []*(取消引用运算符)具有更高的优先级。

此外,这里的转换以及对 reallocmalloc 的调用是不必要的。不要忘记检查 reallocmalloc 等的 return 值,看看它们是否成功分配内存。

现在,你有另一个问题:第二个代码中的 free(str); 应该是 free(*str);。请注意,在 *str 从函数中释放后,您不应该从 main 读取或写入此内存位置,因为它现在已变得无效,您无法篡改。

在您的 int readfromfile(FILE *filepointer, char **str) 中,参数 char **str 实际上与 char *str[] 相同,这意味着 **str 需要一个字符指针数组。但是你传递给它 char *str 这只是一个 char

的数组

当你使用 readfromfile(...) 时,你应该这样做(类似于...):

char *str[2] = {"some char array", "another char array"};
readfromfile(ifpointer, str);

或:

char *a = "this char array";
char **str = &a[0];
readfromfile(ifpointer, str);

你会明白的...