2012-01-16 100 views
1
void openUpNow(FILE *x, FILE *y) 
{ 
    x = fopen("xwhatever", "r"); 
    y = fopen("ywhatever", "r"); 
} 

int _tmain(int argc, _TCHAR* argv[ ]) 
{ 
    FILE *x, *y; 

    openUpNow(x, y); 
} 

警告C4700:未初始化的局部变量 'X' 用抱怨FILE *未初始化

警告C4700:未初始化的局部变量 'y' 的使用

补救措施?

+0

没有一个答案似乎指出,你应该总是检查来自'fopen()'的返回值,以防打开失败。 – 2012-01-16 05:07:44

回答

4

我不认为这是您无论如何要做些什么。

假设你想openUpNow()将文件打开到xy你应该使用:

void openUpNow(FILE **x, FILE **y) 
{ 
    *x = fopen("xwhatever", "r"); 
    *y = fopen("ywhatever", "r"); 
} 

int _tmain(int argc, _TCHAR* argv[ ]) 
{ 
    FILE *x, *y; 

    openUpNow(&x, &y); 

    // do stuff 


} 

换句话说,你需要通过指针xy到函数的地址。

由于您的代码现在正在调用openUpNow()不会做任何事情(并泄漏文件句柄),因为指针是按值传递的。

2
FILE *x = NULL; 
FILE *y = NULL; 

使用未初始化的变量通常会导致未定义的行为,因此编译器会发出警告,以便您可以了解这些变量。

此外,您需要通过引用而不是按值传递指针,或者您在函数内部获得的是原始指针的副本。

void openUpNow(FILE **x, FILE **y) 
       ^^^^^^^^^^^^^^^^^^ 

修正版本:

void openUpNow(FILE **x, FILE **y) 
{ 
    *x = fopen("xwhatever", "r"); 
    *y = fopen("ywhatever", "r"); 
} 

int _tmain(int argc, _TCHAR* argv[ ]) 
{ 
    FILE *x = NULL; 
    FILE *y = NULL; 

    openUpNow(&x, &y); 

} 
2

是的,那代码是坏的。在_tmain,xy未初始化并具有垃圾值。然后你将这些值传递给openUpNow。幸运的是,openUpNow忽略它们。但是,您可以将呼叫中的新值丢到fopen。你想:

void openUpNow(FILE **x, FILE **y) 
{ 
    *x = fopen("xwhatever", "r"); 
    *y = fopen("ywhatever", "r"); 
} 

int _tmain(int argc, _TCHAR* argv[ ]) 
{ 
    FILE *x, *y; 

    openUpNow(&x, &y); 
}