2017-01-05 285 views
-2

幾個月前開始編程,所以我的問題可能會讓你感覺不好(對不起)。將文件指針傳遞給函數

可以說,我想從功能打印的東西,我的test.txt文件是這樣的:

主:

int main() 
{ 
    FILE *fp; 
    test(fp); 
    ... 
} 

功能:

void test(FILE *fp) 
{ 
    fp = fopen("test.txt","w"); // it crashed here 
    ... 
} 

調試在VS說:「變量'fp'正在被使用而未被初始化。「

然後,我決定改變我的主要功能的第一行:

FILE *fp = NULL; 

突然,一切工作正常。

有人能解釋我這種行爲嗎?

+2

這是不確定的行爲來讀取未初始化值(也就是當你計算表達式,你在做什麼'測試(FP)')。 –

+0

代碼也沒有意義,再次顯示未定義的行爲是*症狀*,而不是問題。 –

+0

問題是,當測試返回時,變量fp不保留由fopen調用分配給它的值。所以,如果你稍後在main中使用它,你將會遇到問題 – bruceg

回答

3

你的問題實際上已經無關,與文件指針 - 這一計劃將讓您使用int相同的警告:

void test(int i) 
{ 
    i = 5; 
    ... 
} 

int main() 
{ 
    int i; 
    test(i); 
    ... 
} 

該警告是因爲你傳遞了一個未初始化的變量的函數。未初始化的變量可以保存任何值(或者可能在訪問時會使程序崩潰,但在實踐中,這種情況永遠不會發生)。

所以警告告訴你「嗨,你爲什麼傳遞一個價值,你甚至不知道它的價值是什麼?」

但是,這並不重要,因爲你的test功能然後繼續忽略中傳遞的價值。