好的,我有这样的代码:
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进行编译
发布于 2011-05-13 02:19:11
我很惊讶你的代码能被编译,因为你声明了FILE *pFile的作用域是if和else块。如果您在此之前已经声明了它,那么删除if/else块中赋值前面的FILE*文本。
发布于 2011-05-13 02:20:41
不要在if语句中定义pFile,这样会失去作用域。
FILE * pFile;
if(argc>1){
pFile = fopen(argv[1],"rb");
perror("");
}发布于 2011-05-13 02:37:31
我敢打赌,您之前的代码中有一个没有包含的FILE * pfile;。如果它在所有块之外,并且具有静态存储持续时间,则将其初始化为NULL。
当您在内部块中使用FILE * pfile = fopen(...时,这两个pfile是两个不同的东西。因此,发生了什么:
您在一个块中定义了pfile,并且可以很好地打开它。然后到达块的末尾,它就像块中的任何其他变量local一样被丢弃。
剩下的是原来的pfile,您从未打开过它,也没有给它分配过任何东西,它很可能是空的。
在第二种情况下,您打开一个文件并将其丢弃,然后在与测试if语句相同的作用域中有一个FILE * pfile,这就是您要测试的那个,所以它没有问题。
您需要做的是只定义一次pfile,因为额外的定义要么会导致编译器错误,要么会给出不同的版本。从你的内部代码块中去掉所有的FILE *,并且一直使用相同的pfile。
https://stackoverflow.com/questions/5982473
复制相似问题