加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

getline()/ strsep()组合导致分段错误

发布时间:2020-12-16 10:08:31 所属栏目:百科 来源:网络整理
导读:运行下面的代码时,我遇到了分段错误. 它应该基本上读取超过3M行的.csv文件并在之后执行其他操作(与问题无关),但在207746次迭代后它返回分段错误.如果我删除了p = strsep( line,“|”);只打印整行,它将打印 3M线. int ReadCSV (int argc,char *argv[]){ char
运行下面的代码时,我遇到了分段错误.

它应该基本上读取超过3M行的.csv文件并在之后执行其他操作(与问题无关),但在207746次迭代后它返回分段错误.如果我删除了p = strsep(& line,“|”);只打印整行,它将打印> 3M线.

int ReadCSV (int argc,char *argv[]){

    char *line = NULL,*p;
    unsigned long count = 0;

    FILE *data;
    if (argc < 2) return 1;
    if((data = fopen(argv[1],"r")) == NULL){
        printf("the CSV file cannot be open");
        exit(0);
    }


    while (getline(&line,&len,data)>0) {

        p = strsep(&line,"|");  

        printf("Line number: %lu t p: %sn",count,p);
        count++;
    }

    free(line);
    fclose(data);

    return 0;
}

我想它与内存分配有关,但无法弄清楚如何修复它.

解决方法

getline和strsep的组合经常会引起混淆,因为两个函数都会将指针传递给指针作为初始参数.如果再次将通过strsep的指针传递给getline,则在第二次迭代时会冒未定义行为的风险.

考虑一个例子:getline为行分配101个字节,并在其中读取一个100个字符的字符串.请注意,len现在设置为101.您调用strsep,它会找到’|’在字符串的中间,所以它指向过去的第50行.现在你再次调用getline.它看到另一个100个字符的行,并得出结论可以将它复制到缓冲区中,因为len仍然是101.但是,由于行现在指向缓冲区的中间,因此写入100个字符将成为未定义的行为.

在调用strsep之前复制一行:

while (getline(&line,data)>0) {
    char *copy = line;
    p = strsep(&copy,"|");  
    printf("Line number: %lu t p: %sn",p);
    count++;
}

现在,在循环迭代之间保留传递给getline的行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读