我是 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 .您会发现 []
的优先级高于 *
(取消引用运算符)。
另外,这里的强制转换,以及对 realloc
和 malloc
的调用,都是不必要的。不要忘记检查 realloc
、malloc
等的返回值,看看它们是否成功分配内存。
现在,您有另一个问题:第二个代码中的free(str);
应该是free(*str);
。请注意,在 *str
从函数中释放后,您不应该从 main
读取或写入此内存位置,因为它现在对您来说变得无效篡改。
关于c - 在函数中通过指针修改 char* 会导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33279386/