在 C 中查找分段错误

Finding segmentation fault in C

我已经评论了所有我认为会给我错误的代码,但我仍然明白。这是我的代码:

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

你检查 sourcefile 没有初始化它。另外,remvocals 有什么作用?

//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

移动

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

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

的正文中

您没有提供足够的信息。

在您的代码中,明显的问题是;

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,但您没有提供任何相关信息。即使解决了前两个问题,函数也可能会做很多引入未定义行为的事情。

鉴于以上所有情况,您的代码很可能甚至不能代表您的实际问题。您最好提供一个小而完整的示例,该示例在构建时可以实际演示您的问题。否则,试图帮助您的人就是靠猜测。