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

标签 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;
}

并且这段代码不会:

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

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

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

最佳答案

你会崩溃是因为

*str[counter] = (char) character;

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

相对于

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

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

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

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

关于c - 在函数中通过指针修改 char* 会导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33279386/

相关文章:

php - 无法将字符串偏移量用作数组 - 我需要在 foreach 中反序列化吗?

c# - 将数组从 C# 返回到 javascript 的最佳(简单且清晰)方法是什么

ruby - 在 Ruby 中,如何在不调用函数对象的情况下显示或打印出它?

javascript - 在javascript中将uint8array转换为double

javascript - 清除立即调用的函数中的 setTimeout

javascript - setTimeout 不适用于我的 onclick 事件

c - 通过管道将逐位加密传递到输出文件

c - 如何在C中使用exec传递参数并使用它们?

c - 缓冲区溢出解释

c - C 中 double 的二元运算