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

JJJ*_*JJJ 1 c arrays function char dynamic-memory-allocation

我是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] = '\0';
    printf("+%s+", str);
    free(str);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

而且这段代码没有:

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] = '\0';
    printf("+%s+", *str);
    free(str);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

我花了一个时间试图让这个工作并做了很多研究所以我道歉如果我错过了一个解决方案,但我真的陷入了这一点.

Spi*_*rix 7

你得到了崩溃,因为

*str[counter] = (char) character;
Run Code Online (Sandbox Code Playgroud)

是相同的

*(str[counter]) = (char) character;
Run Code Online (Sandbox Code Playgroud)

而不是

(*str)[counter] = (char) character;
Run Code Online (Sandbox Code Playgroud)

这实际上是你想要的.阅读Wikipedia上的运算符优先级.你会发现它的[]优先级高于*(取消引用运算符).

此外,这里的演员以及对realloc和的调用malloc都是不必要的.不要忘记检查等的返回值realloc,malloc看看它们是否成功分配了内存.

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