我遇到了细分错误,并且valgrind用getline向我显示了此错误

时间:2018-12-04 12:15:17

标签: c valgrind getline

当我运行valgrind时,我收到以下消息:
    大小为4的读取无效     在getdelim     通过getline     按主要(y行)     地址未堆栈,未分配或(最近)释放

int main() {
    char *line = NULL;
    size_t len = 0;
    ssize_t read = 0;

    FILE *fp = fopen(argv[2], "r");
    read = getline(&line, &len, fp);     //this is the line that gives error on valgrind
    free(line);
    fclose(fp);

}

为什么会这样?

2 个答案:

答案 0 :(得分:3)

代码中涉及getline的唯一潜在错误是fopen失败,然后fp为NULL,然后将其提供给getline。

检查fopen函数的返回值,并使用perror或其他类似函数了解发生故障时的情况。

但我想指出的是,您正在使用argv,并且argv在代码中根本没有定义(它来自何处?),并且您不检查argv [2]是否存在(argc必须大于2),因此这些点也是潜在的故障。

答案 1 :(得分:0)

像这样使用main

int main(int argc, char *argv[]) { /* ... */ }

FILE *fp = fopen(argv[0], "r"); // This is a command line argument type of code.

xyz@abc:~$ ./a.out filename