我是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
之后崩溃。分配给第一个值的字符也是垃圾。
我花了一个时间试图让这个工作并做了大量的研究,所以如果我错过了一个解决方案,我很抱歉,但我真的被困在这一点。
答案 0 :(得分:7)
因为
而导致崩溃*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
读取或写入此内存位置,因为它现在变得无效,您可以篡改。
答案 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);
你会得到这个想法......