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

时间:2015-10-22 10:57:40

标签: 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之后崩溃。分配给第一个值的字符也是垃圾。

我花了一个时间试图让这个工作并做了大量的研究,所以如果我错过了一个解决方案,我很抱歉,但我真的被困在这一点。

2 个答案:

答案 0 :(得分:7)

因为

而导致崩溃
*str[counter] = (char) character;

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

而不是

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

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

此外,此处的演员以及reallocmalloc的来电都是不必要的。不要忘记检查reallocmalloc等的返回值,看看它们是否成功分配了内存。

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

答案 1 :(得分:0)

在您的int readfromfile(FILE *filepointer, char **str)中,参数char **str实际上与char *str[]相同,这意味着**str期待一个char指针数组。但是你传递给它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);

你会得到这个想法......