Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用getline()输入时出现分段错误_C_Segmentation Fault - Fatal编程技术网

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()
的整数将用新大小更新