【发布时间】:2018-06-09 05:26:37
【问题描述】:
我在运行下面的代码时遇到了分段错误。
它基本上应该读取一个超过 3M 行的.csv 文件,然后执行其他操作(与问题无关),但在 207746 次迭代后它返回分段错误。如果我删除 p = strsep(&line,"|"); 并只打印整个 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: %s\n", count, p);
count++;
}
free(line);
fclose(data);
return 0;
}
我猜这与内存分配有关,但不知道如何解决。
【问题讨论】:
-
#207746 行中是否至少有一个分隔符?如果没有,strsep() 的行为会有所不同。
-
strsep修改了它的第一个参数,所以你失去了第一次分配给你的缓冲区getline的开始。不要那样做,如果必须使用strsep,请使用单独的临时文件。并检查p不是 NULL。len在哪里声明?在你打电话给getline之前是零吗?
标签: c segmentation-fault getline strsep