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(©,"|"); printf("Line number: %lu t p: %sn",p); count++; } 现在,在循环迭代之间保留传递给getline的行. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |