使用getline()C时出现分段错误

使用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

我看到的其他每个线程都存在这样的问题:没有将行初始化为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(&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()
      的限制
    注意,我并不是说你不应该使用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:没有这样的文件或目录。”