gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:00:38 26 4
gpt4 key购买 nike

运行下面的代码时出现段错误。

它基本上应该读取一个超过 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;
}

我猜这与内存分配有关,但不知道如何解决。

最佳答案

getlinestrsep 的组合经常会引起混淆,因为这两个函数都会更改您通过指针作为初始参数传递给它们的指针。如果您将已经通过 strsep 的指针再次传递给 getline,您将面临在第二次迭代中出现未定义行为的风险。

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

在调用 strsep 之前复制 line:

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

现在,您传递给 getlineline 会在循环迭代之间保留。

关于c - getline()/strsep() 组合导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48011292/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com