使用fgets()从stdin读取
我是C语言编程的新手,目前正在尝试使用fgets()从stdin读取一行,但是由于使用char *指向字符串I,我在内存分配方面遇到了麻烦想读.当我执行该文件时,它报告了分段错误.
I'm new to C programming and I'm currently trying to read a line from stdin using fgets(), but I'm having trouble with memory allocation since I'm using a char* to point to the string I want to read. When I execute the file it reports a segmentation fault.
这是我正在使用的功能:
This is the function I'm using:
char *read_line(char *line){
printf("%s",PROMPT);
line = (char*)malloc(sizeof(char)*500);
fgets(line,sizeof(line),stdin);
printf("%s","pasa el fgets");
return line;
}
我的主要对象:
void main(){
char line0;
char *line=&line0;
while(read_line(line)){
execute_line(line);
}
}
主要错误是将指针line
传递给函数read_line
(按值)并尝试在该函数中对其进行修改.
The main mistake is to pass the pointer line
to the function read_line
(by value) and try to modify it in that function.
read_line
分配内存并实际创建指针值.因此它应该能够在main
中更改line
的值:
read_line
allocates the memory and actually creates the pointer value. So it should be able to change the value of line
in main
:
char *read_line(char **line){
...
*line = malloc(500);
fgets(*line, 500, stdin);
...
return *line;
}
int main(void) {
char *line;
while(read_line(&line)){
...
}
}
或者,您可以使用read_line
的返回值来修改main
的line
.在这种情况下,您根本不需要该参数:
Or, you use the return value of read_line
in order to modify main
's line
. In that case you don't need the parameter at all:
char *read_line(void) {
char *line;
...
line = malloc(500);
fgets(line, 500, stdin);
...
return line;
}
int main(void) {
char *line;
while(line = read_line()){
...
}
}
其他错误(乔纳森·莱因哈特(Jonathon Reinhart)指出)和备注:
Additional errors (pointed out by Jonathon Reinhart) and remarks:
-
sizeof
对于指针(阵列衰减到指针)不起作用. - 您
malloc
许多字符串line
,但您没有free
他们. -
sizeof(char)
始终为1. - 有些人(我也是)认为应该避免强制转换
malloc
的结果.
-
sizeof
does not "work" for pointers (array decayed to pointers). - You
malloc
many stringsline
but you do notfree
them. -
sizeof(char)
is always 1. - Some people (me too) think that casting the result of
malloc
should be avoided.