2012-01-16 52 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); 
} 
相關問題