在 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
的第二个参数放在第二个和第三个 if
s.
的正文中
您没有提供足够的信息。
在您的代码中,明显的问题是;
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,但您没有提供任何相关信息。即使解决了前两个问题,函数也可能会做很多引入未定义行为的事情。
鉴于以上所有情况,您的代码很可能甚至不能代表您的实际问题。您最好提供一个小而完整的示例,该示例在构建时可以实际演示您的问题。否则,试图帮助您的人就是靠猜测。
我已经评论了所有我认为会给我错误的代码,但我仍然明白。这是我的代码:
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
的第二个参数放在第二个和第三个 if
s.
您没有提供足够的信息。
在您的代码中,明显的问题是;
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,但您没有提供任何相关信息。即使解决了前两个问题,函数也可能会做很多引入未定义行为的事情。
鉴于以上所有情况,您的代码很可能甚至不能代表您的实际问题。您最好提供一个小而完整的示例,该示例在构建时可以实际演示您的问题。否则,试图帮助您的人就是靠猜测。