【问题标题】:I'm getting segmentation fault and valgrind shows me this error with getline [closed]我遇到了分段错误,valgrind 用 getline 向我显示了这个错误 [关闭]
【发布时间】:2019-05-05 20:52:05
【问题描述】:

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

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);

}

为什么会这样?

【问题讨论】:

  • 欢迎来到 Stack Overflow。请阅读the help pages,获取the SO tour,了解how to ask good questions,以及this question checklist。最后学习如何创建minimal reproducible example 向我们展示。
  • 更具体地说,请将 full Valgrind 输出复制粘贴到问题正文中,无需修改。作为文本。然后包括一个展示问题的实际程序,而不是一些伪代码。您当前显示的代码缺少关键信息和上下文。
  • 这可能是个愚蠢的问题,但你真的向程序传递了三个命令行参数吗?
  • 这怎么编译?
  • 无法编译:error: ‘argv’ undeclared (first use in this function)

标签: c valgrind getline


【解决方案1】:

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

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

但我想指出您正在使用 argv 并且 argv 根本没有在您的代码中定义(它来自哪里?),并且您没有检查 argv[2] 是否存在(argc 必须大于2),所以这些点也​​是潜在的失败。

【讨论】:

  • 哦,没错! argv[argc] == NULL
【解决方案2】:

这样使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2022-01-25
    • 2023-02-15
    • 2020-03-21
    • 1970-01-01
    • 2021-04-13
    相关资源
    最近更新 更多