这段代码中的分段错误,但我找不到它?

时间:2015-01-27 07:59:08

标签: c segmentation-fault

请帮助,我已经评论了我认为给我一个错误的所有代码,但我仍然得到它。这是我的代码:

int main(int argc, char **argv) {
    // argc is the number of command line arguments, in our case there are two
    // argv is an array of pointers, a[0] is the program name, a[1] will be sourcewav
    // and a[2] should be destwav
    FILE * source_file;
    FILE * destination_file = fopen(argv[2], "w") ;      // create destwav file

    if (argc != 3) {
        printf("Usage: requires two parameters: sourcewav and destwav");
        exit(1);

    }
    //source_file = fopen(argv[1], "r+");
    if (!source_file) {  // pointer is null, file can't be opened
        printf("Usage: %s sourcewav file cannot be opened\n", argv[0]);
            exit(1);
        }
    printf("1");
    remvocals(source_file, destination_file); // remove vocals

    int closed_properly = fclose(source_file); // has source_file successfully closed?
    if (closed_properly != 0) {
        printf("Usage: %s sourcewav was not closed properly\n", argv[0]);
        exit(1);
    }
    fclose(destination_file);
    return 0;
}

非常感谢你!我一直在尝试调试它超过3个小时。

4 个答案:

答案 0 :(得分:2)

在没有初始化的情况下检查sourcefile。另外,什么是remvocals呢?

答案 1 :(得分:1)

移动

if (argc != 3) {
     printf("Usage: requires two parameters: sourcewav and destwav");
     exit(1);
 }

在声明你的FILE指针之前。此外,取消注释初始化source_file的行。我认为您需要argv[1]而不是argv[0]作为放置在第二个和第三个printf主体中的if的第二个参数。

答案 2 :(得分:1)

您没有提供足够的信息。

在您的代码中,显而易见的问题是:

1)永远不会检查destination_file以查看fopen()是否成功。如果destination_file为NULL,则对其执行的任何操作(fprintf(),fclose())都将给出未定义的行为。 fopen()需要在检查argc之后,而不是之前。

2)使用“source_file = fopen(argv [1],”r +“)”语句注释,source_file是未初始化的变量。访问它的值 - 更不用说将它作为文件参数传递给I / O函数 - 将给出未定义的行为。

3)你有一个名为remvocals()的函数(可能)正在将数据从source_file复制到destination_file,但是你没有提供任何关于它的信息。即使解决了前两个问题,也有许多功能可能会导致未定义的行为。

鉴于上述所有情况,您的代码很可能甚至无法代表您的实际问题。你最好提供一个小而完整的样本 - 在构建时 - 实际上证明了你的问题。否则,试图帮助你的人就会采取猜测。

答案 3 :(得分:0)

//source_file = fopen(argv[1], "r+");
if (!source_file) {  // pointer is null, file can't be opened
    printf("Usage: %s sourcewav file cannot be opened\n", argv[0]);
        exit(1);
    }

在我看来,你忘记取消注释这一行:

//source_file = fopen(argv[1], "r+");

你也应该搬家:

if (argc != 3) {
    printf("Usage: requires two parameters: sourcewav and destwav");
    exit(1);
}

在你开始这一行的行之前:

FILE * destination_file = fopen(argv[2], "w") ;      // create destwav file