0

为什么这个简单的功能会导致段错误?

int main(int argc, char** argv) {
    FILE* file1;
    file1 = fopen(argv[argc + 1], "wt");
    fclose(file1);
}
4

2 回答 2

3

fopen()无法打开文件,fpNULL 也是如此,因此fclose()通过崩溃合法地反对也是如此。检查从fopen().

另外,根据定义,argv[argc] == 0andargv[argc+1]超出了数组的末尾。实际上,在 Unix 系统上,它通常是name=value第一个环境变量的第一个,但它不太可能是有效的文件名,而且肯定不是合法获得的。

如果您的程序被调用为:

./a.out file.txt

那么文件名是argv[1]; 所指向的字符串argv[0]是程序的名称,a.out给予或获取路径信息,andargc == 2argv[2] == 0argc == 2在尝试打开文件之前不要忘记检查。

始终检查返回状态,尤其是来自“已知失败”功能,例如fopen(). 并打印您要打开的名称——它会告诉你很多关于你的问题的信息——在检查它argc设置为你期望的值之后。

于 2012-02-28T19:26:23.027 回答
2

您在 的最后一个元素之后访问两个元素argv。您也不检查 的返回值fopen(),两者都可能导致段错误。

于 2012-02-28T19:22:58.487 回答