是的,我有这段代码:
if(argc>1){
FILE * pFile = fopen(argv[1],"rb");
perror("");
}else{
FILE * pFile = fopen("hardcoded","rb");
}
if(pFile==NULL){
puts("Unable to open source file");
return -1;
}
然而,我得到了这个奇怪的输出:
Success
Unable to open source file
很奇怪,如果我这样做:
if(argc>1){
FILE * pFile = fopen(argv[1],"rb");
perror("");
}else{
FILE * pFile = fopen("hardcoded","rb");
}
FILE * pFile = fopen("hardcoded","rb");
if(pFile==NULL){
puts("Unable to open source file");
return -1;
}
存在硬编码的地方,一切正常!
这意味着什么?
在Ubuntu上使用GCC4进行编译
答案 0 :(得分:5)
我很惊讶你的代码编译,因为你声明FILE *pFile
作用于if和else块。如果您之前已声明,请删除if / else块中作业前面的FILE*
文本。
答案 1 :(得分:0)
不要在if
语句中定义pFile,否则会失去范围。
FILE * pFile;
if(argc>1){
pFile = fopen(argv[1],"rb");
perror("");
}
答案 2 :(得分:0)
我敢打赌你的代码中有FILE * pfile;
前面没有包含的内容。如果它在所有块之外,并且具有静态存储持续时间,则它被初始化为NULL。
当你在内部区块中有FILE * pfile = fopen(...
时,两个pfile
是两个不同的东西。因此,发生了什么:
您在一个区块中定义pfile
,并将其打开。然后到达块的末尾,它就像块中的任何其他变量一样被丢弃。
你留下的原始pfile
,你从未打开或分配任何内容,而且可能是NULL。
在第二种情况下,您打开一个文件并将其丢弃,然后您的FILE * pfile
与测试if
语句的范围相同,那就是您正在测试的文件,所以没关系。
您需要做的只是定义pfile
一次,因为其他定义会导致编译器错误或为您提供单独的版本。从内部块中取出所有FILE *
,并始终使用相同的pfile
。