使用getline()C时出现分段错误
我看到的其他每个线程都存在这样的问题:没有将行初始化为NULL,将len初始化为0。这是我代码的一部分:使用getline()C时出现分段错误,c,getline,C,Getline,我看到的其他每个线程都存在这样的问题:没有将行初始化为NULL,将len初始化为0。这是我代码的一部分: char* line = NULL; char* line2 = NULL; size_t len = 0; size_t len2 = 0; char *function = NULL; size_t read, read2; //read2 gia to config while ((read = getline(&am
char* line = NULL;
char* line2 = NULL;
size_t len = 0;
size_t len2 = 0;
char *function = NULL;
size_t read, read2; //read2 gia to config
while ((read = getline(&line, &len, op)) != -1)
{
line[read - 2] = 0;
char* pch;
pch = strtok(line, " ");
strcpy(function, pch);
提前感谢。您的代码有多个问题
读取<2
,则索引小于0
pch
为NULL
,则取消引用NULL
指针
关于strtok()的注释
- 当找不到分隔符时,它返回
NULL
- 处理多个字符串或在多线程程序中使用它是非常糟糕的,因为它不可重入
- 总有一个更好的选择,包括
、strchr()
或strstr()
,所有这些都没有strpbrk()
的限制strtok()
'\t'
选项卡字符,就像他们处理'
空白一样getline()
,因为众所周知它工作正常,所以它几乎不是故障
您的程序调用未定义的行为,因此无法确定问题到底发生在何处,因为它可能发生在某个地方,并且程序将继续运行,直到有人执行触发分段错误的操作。如果
读取<2
,这是什么意思?你的意思是,变量在定义中编码时没有初始化吗?您的意思是在调用getline
之后,line
是NULL
而len
是0
?你能详细说明一下吗?如果可能的话,也请创建一个来向我们展示。为什么您如此确定getline()是SEGFULT的原因?您肯定没有使用调试器,否则您可能已经发现了错误,那么您如何判断它不是strcpy()
之后试图将某些内容复制到*函数中存储的NULL
指针?你是不是碰巧指function=strdup(pch)代码>?由于您没有显示使用line2
、len2
、read2
的代码,也没有显示循环的其余部分,因此我们无法判断取消显示的代码中是否存在问题。MCVE()不包含这些变量。(就个人而言,如果我有两组变量,它们是line1
和line2
,而不是line
和line2
,但很多人都是按照你的方式来做的——当我看到它们时,我会很恼火。)。但是,您没有为要指向的函数分配空间,因此strcpy(函数,pch)
失败-可能是分段错误。这是错误的:strcpy(函数,pch)因为函数
没有指向程序拥有的内存。(它指向NULL
,这有效地解决了0;我毫不怀疑程序的其余部分存在多个问题,感谢您的提示。但它在转到其余行之前确实出现了分段错误,因此我对原因感到困惑。未定义的行为意味着您无法知道SIGSEGV将发生在何处。)r、 @meerto只要使用调试器,一行一行地检查代码,你就会突然说“哦!这就是问题所在,哦,我太……了,;)哈哈!我做了gdb,但我对使用它还相当陌生。它抱怨说:“程序接收到信号SIGSEGV,分段错误。_IO_getdelim(lineptr=0x7fffffffdcc0,n=0x7fffffffdcc8,delimiter=10,fp=0x0)位于iogetdelim.c:52 iogetdelim.c:没有这样的文件或目录。”