为什么这个简单的功能会导致段错误?
int main(int argc, char** argv) {
FILE* file1;
file1 = fopen(argv[argc + 1], "wt");
fclose(file1);
}
您fopen()
无法打开文件,fp
NULL 也是如此,因此fclose()
通过崩溃合法地反对也是如此。检查从fopen()
.
另外,根据定义,argv[argc] == 0
andargv[argc+1]
超出了数组的末尾。实际上,在 Unix 系统上,它通常是name=value
第一个环境变量的第一个,但它不太可能是有效的文件名,而且肯定不是合法获得的。
如果您的程序被调用为:
./a.out file.txt
那么文件名是argv[1]
; 所指向的字符串argv[0]
是程序的名称,a.out
给予或获取路径信息,andargc == 2
和argv[2] == 0
。argc == 2
在尝试打开文件之前不要忘记检查。
始终检查返回状态,尤其是来自“已知失败”功能,例如fopen()
. 并打印您要打开的名称——它会告诉你很多关于你的问题的信息——在检查它argc
设置为你期望的值之后。
您在 的最后一个元素之后访问两个元素argv
。您也不检查 的返回值fopen()
,两者都可能导致段错误。