在函数中修改char*by指针会导致崩溃
我是C语言的新手,我正在尝试为读取文件计算动态内存分配。至少我认为这就是我在做的 无论如何,这段代码是有效的:在函数中修改char*by指针会导致崩溃,c,arrays,function,char,dynamic-memory-allocation,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)
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;
这正是你想要的。阅读您会发现[]
比*
(取消引用操作符)具有更高的优先级
此外,这里的强制转换以及对realloc
和malloc
的调用都是不必要的。不要忘记检查realloc
、malloc
等的返回值,看看它们是否成功分配了内存
现在,您有另一个问题:
free(str)第二个代码中的代码>应该是free(*str)代码>。请注意,从函数中释放*str
后,您不应该从main
读取或写入此内存位置,因为您现在无法对其进行篡改。您会遇到崩溃,因为
*str[counter] = (char) character;
与
*(str[counter]) = (char) character;
相对于
(*str)[counter] = (char) character;
这正是你想要的。阅读您会发现[]
比*
(取消引用操作符)具有更高的优先级
此外,这里的强制转换以及对realloc
和malloc
的调用都是不必要的。不要忘记检查realloc
、malloc
等的返回值,看看它们是否成功分配了内存
现在,您有另一个问题:free(str)第二个代码中的代码>应该是free(*str)代码>。请注意,从函数中释放*str
后,您不应该从main
读取或写入此内存位置,因为您现在无法对其进行篡改。在int readfromfile(FILE*filepointer,char**str)中
参数char**str
实际上与char*str[]
相同,这意味着**str
需要一个字符指针数组。但是,您要传递给它的是char*str
,它只是char
当您使用readfromfile(…)时,您应该这样做(类似于…):
或:
在int readfromfile(FILE*filepointer,char**str)
中,您会得到一个想法…参数char**str
实际上与char*str[]
相同,这意味着**str
需要一个字符指针数组。但是,您要传递给它的是char*str
,它只是char
当您使用readfromfile(…)时,您应该这样做(类似于…):
或:
你会想到…永远不要强制转换malloc的结果。它会在添加更多字符时重新分配内存,不是吗?至于释放内存,我的歉意是,我只是测试检查它是否已被释放,现在已被编辑掉。你不需要为malloc
@JJJ添加强制转换,是的,我没有看到realloc
部分,对不起。永远不要强制转换malloc的结果。它会在添加更多字符时重新分配内存,尽管它不会?至于释放内存,我很抱歉刚才只是为了检查它是否被释放,现在被编辑掉了。你不需要为malloc
@JJJ添加演员阵容,是的,我没有看到realloc
部分,抱歉。非常感谢!我不敢相信丢失了一组括号会给我带来这么多麻烦,我一定要读一读。@JJJ这两个操作之间的差异可能看起来不是很强,但它是两个完全不同的操作,所以当然这两个操作会导致两个不同的结果。@Cool Guy啊,谢谢,现在已经摆脱了演员阵容,我也要加入realloc/malloc的检查。非常感谢!我不敢相信丢失了一组括号会给我带来这么多麻烦,我一定要读一读。@JJJ这两个操作之间的差异可能看起来不是很强,但它是两个完全不同的操作,所以当然这两个操作会导致两个不同的结果。@Cool Guy啊,谢谢,现在已经摆脱了强制转换,我也将添加realloc/malloc的检查。“这意味着**str
需要一个字符指针数组”--不。它需要一个指向char
(achar**
)的指针。“但是您正在传递给它char*str
,它只是一个char
数组。”--否。OP正在传递&str
,这是一个字符**
,这正是readfromfile
的第二个参数所要求的。“这意味着**str
需要一个字符指针数组”--否。它需要一个指向字符的指针(a字符**
)“但是,您要传递给它的是char*str
,它只是char
的一个数组。”--不。OP传递的是&str
,它是char**
,这正是readfromfile
的第二个参数所要求的。