C 使用getline()输入时出现分段错误
我试图编写一个简单的程序,接收用户的输入,然后打印出来。在用户键入C 使用getline()输入时出现分段错误,c,segmentation-fault,C,Segmentation Fault,我试图编写一个简单的程序,接收用户的输入,然后打印出来。在用户键入“done”之前,必须一直这样做 当我运行下面的代码时,我输入“01”,然后得到一个分段错误(堆芯转储) 我认为这与getline()有关,但我不知道。如果有人能向我解释为什么它不工作以及如何修复它,我将不胜感激 #include <stdio.h> #include <stdlib.h> int main(){ char* line; size_t size ; size = 100; char* d
“done”
之前,必须一直这样做
当我运行下面的代码时,我输入“01”,然后得到一个分段错误(堆芯转储)
我认为这与getline()
有关,但我不知道。如果有人能向我解释为什么它不工作以及如何修复它,我将不胜感激
#include <stdio.h>
#include <stdlib.h>
int main(){
char* line;
size_t size ;
size = 100;
char* done;
done = "done";
printf("0");
while ( strcmp(line, "done") != 0 ) {
printf("1");
getline(&line, &size, stdin);
printf("2");
printf("%s\n", line);
}
return 0;
}
#包括
#包括
int main(){
字符*行;
大小;
尺寸=100;
字符*完成;
done=“done”;
printf(“0”);
而(strcmp(第行,“完成”)!=0{
printf(“1”);
getline(&line,&size,标准尺寸);
printf(“2”);
printf(“%s\n”,第行);
}
返回0;
}
您没有为以下内容分配内存:
char* line;
行
在指向有效对象之前是无效指针。使用malloc
分配内存,例如,line=malloc(大小)代码>您没有为以下内容分配内存:
char* line;
行
在指向有效对象之前是无效指针。使用malloc
分配内存,例如,line=malloc(大小)代码>
当不再需要时,请记住释放内存:
free(line);
当不再需要时,请记住释放内存:
free(line);
在这里,您只有一个指针,它不指向任何东西(实际上是垃圾):
从手册页中:
如果*lineptr为NULL,则getline()将分配一个缓冲区来存储该行,该缓冲区应由用户程序释放。(在这种情况下,忽略*n中的值。)
或者,在调用getline()之前,*lineptr可以包含指向malloc(3)分配的缓冲区*n字节大小的指针。如果缓冲区不够大,无法容纳该行,则getline()使用realloc(3)调整其大小,并根据需要更新*lineptr和*n
在这两种情况下,在成功调用时,*lineptr和*n将分别更新以反映缓冲区地址和分配的大小
因此,请注意,不能为getline使用堆栈分配的缓冲区
更简单的方法是将line
初始化为NULL,并让getline
为您处理分配:
char* line = NULL;
int size = 0;
getline(&line, &size, stdin); // line and size are updated with buffer addr and size.
//...
free(line);
在这里,您只有一个指针,它不指向任何东西(实际上是垃圾):
从手册页中:
如果*lineptr为NULL,则getline()将分配一个缓冲区来存储该行,该缓冲区应由用户程序释放。(在这种情况下,忽略*n中的值。)
或者,在调用getline()之前,*lineptr可以包含指向malloc(3)分配的缓冲区*n字节大小的指针。如果缓冲区不够大,无法容纳该行,则getline()使用realloc(3)调整其大小,并根据需要更新*lineptr和*n
在这两种情况下,在成功调用时,*lineptr和*n将分别更新以反映缓冲区地址和分配的大小
因此,请注意,不能为getline使用堆栈分配的缓冲区
更简单的方法是将line
初始化为NULL,并让getline
为您处理分配:
char* line = NULL;
int size = 0;
getline(&line, &size, stdin); // line and size are updated with buffer addr and size.
//...
free(line);
不能将非malloc
ed对象传递给getline
。请参阅在调用getline之前,您应该在*lineptr中放置一个缓冲区的地址*n字节长,用malloc分配。其基本原理是,如果缓冲区大小不足以容纳行,则getline
可以realloc
对象。不能将非malloc
ed对象传递给getline
。请参阅在调用getline之前,您应该在*lineptr中放置一个缓冲区的地址*n字节长,用malloc分配。其基本原理是,如果缓冲区大小不足以容纳行,则getline
可以realloc
对象。成功后,getline()和getdelim()返回读取的字符数,包括分隔符,但不包括终止的空字节。
如接受答案的引号中所述,如果指向的内存为realloc()
ed,则传递到getline()
的整数将更新为新的大小。如果成功,getline()和getdelim()返回读取的字符数,包括分隔符,但不包括终止的空字节。
如接受答案的引号中所述,如果指向的内存是realloc()
的,则传递给getline()
的整数将用新大小更新