【问题标题】:Segmentation fault 11?分段错误 11?
【发布时间】:2016-05-12 04:20:39
【问题描述】:

我的程序可以编译,但是当我运行它./program -n 3 1000.txt 时,我得到了

分段错误:11。

什么意思?

我的程序做了什么:打印文件的前 10 行。如果文件少于 10 行,则应打印整个文件。该程序不应创建任何文件。它只是将文件的部分内容打印到标准输出。

还应该可以指定打印不同的行数。这将通过将字符串-n 作为第一个参数传递给程序,将要打印的行数作为第二个参数并将文件作为第三个参数来指定。

#include <stdio.h>
#include <stdlib.h>

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

int i, n;
char line[1024];
n = atoi(argv[2]);

if(argc == 2){ //eg ./program 1000.txt
    FILE * fPointer;
    fPointer = fopen("1000.txt", "r");
    for(i = 1; i <= 10; i++){
        fgets(line, 1024, fPointer);
        fprintf(fPointer, "%s\n", line);
    }
    fclose(fPointer);
} else if(argc == 4){ //eg ./program -n 4 1000.txt
    FILE * fPointer;
    fPointer = fopen("1000.txt", "r");
    for(i = 1; i <= n; i++){
        fgets(line, 1024, fPointer);
        fprintf(fPointer, "%s\n", line);
    }
    fclose(fPointer);
} else {
    printf("Wrong number of inputs.\n");
}

return 0;

}

【问题讨论】:

  • 你的程序做了操作系统不喜欢的事情。您确定可读的1000.txt 存在于正确的路径中吗?添加检查fopen()是否成功是好的。
  • 这意味着你正在访问你不应该访问的内存。也许是一个空指针?使用调试器找出答案。 PS:查看fopen的手册页,如果文件无法打开,它可能会返回null
  • 使用调试器帮助您找到问题。你真的应该在你的代码中添加错误检查。这将使您的代码更加健壮,也将帮助您调试任何问题。
  • 您使用的是 Linux 吗?只需在 GDB 上运行它,它就会显示崩溃的位置以及原因。
  • 如果argc2n = atoi(argv[2]); 是一个问题。您需要将其移动到 if ( argc == 4) 下的块内。

标签: c file segmentation-fault arguments


【解决方案1】:

本示例将打印文件的 3 行参数 $ ./a.out -n 3 data.txt。我将atoint 移动到条件中,并将打印更改为printf

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int i, n;
    char line[1024];
    FILE *fPointer;
    if (argc == 2) { //eg ./program 1000.txt
        FILE *fPointer;
        fPointer = fopen("data.txt", "r");
        for (i = 1; i <= 10; i++) {
            fgets(line, 1024, fPointer);
            printf("%s\n", line);
        }
        fclose(fPointer);
    } else if (argc == 4) { //eg ./program -n 4 1000.txt
        n = atoi(argv[2]);
        FILE *fPointer;
        fPointer = fopen("data.txt", "r");
        for (i = 1; i <= n; i++) {
            fgets(line, 1024, fPointer);
            printf("%s\n", line);
        }
        fclose(fPointer);
    } else {
        printf("Wrong number of inputs.\n");
    }
    return 0;
}

文件数据.txt

Superman
Batman
Cyclops
Thor
Wolverine
Superman
Batman
Cyclops
Thor
Wolverine
Superman
Batman
Cyclops
Thor
Wolverine
Superman
Batman
Cyclops
Thor
Wolverine

输出

$ ./a.out -n 3 data.txt
Superman

Batman

Cyclops

【讨论】:

    【解决方案2】:
    fprintf(fPointer, "%s\n", line)
    

    这就是问题所在。您将通过fgets 获得一行到您的数组中,而不是将其打印到标准输出,而是尝试打印到您以只读方式打开的文件。你只需要使用普通的printf 来完成这项工作。

    编辑

    原来这不是segfaults的原因,但如果你想让你的程序做你想做的事情,这仍然是个问题。

    检查文件是否真的存在,这可能是@MikeCAT指出的问题。

    【讨论】:

    • 你确定吗?我没有阅读足够多的规范来确定这是否会导致未定义的行为,但程序没有在my experiment 中引发分段错误。
    • @MikeCAT 是的,你是对的。我认为这就是问题所在。然而,它在我的电脑上工作,但没有在任何地方写任何东西。有趣的是,当我找到相关内容时,我会编辑我的答案。
    • 如果不使用错误数量的参数,我无法让它进入段错误,它只会在“n = atoi(argv[2]);”中出现段错误。很抱歉在没有检查的情况下发布答案。
    • I removed the file 时出现分段错误。
    • @MikeCAT 是的,我也尝试过,但遇到了段错误。我应该编辑我的答案以包含此内容,还是您会发布答案?
    猜你喜欢
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2017-06-25
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多