2011-07-25 63 views
3

蔭試圖編譯這個程序,但我得到警告,當我運行VC++ 2010調試器彈出:( 這裏是我的代碼:警告:未初始化的變量//但我已初始化! C++編譯器錯誤?

#include <iostream> 
using namespace std; 
int num; 
int min(int mas[]) 
{ 
    int i,minn,index;  /* But I have declared them : ((((*/ 
    for(i=0;i<num;i++) 
     { 
      if(mas[i]!=0)minn=mas[i]; 
      break; 
     } 
    if(i==num) return 0; 
    for(i=0;i<num;i++) 
     if(mas[i]!=0 && minn>mas[i]) 
     { 
      minn=mas[i]; 
      index=i; 
     } 

    mas[index]=0; 
    return minn; 
} 

int main() 
{ 
    cin>>num; 
    int *array=new int[num]; int tmp; 
    tmp=min(array); 

} 

,這裏是一個編譯器日誌:

prog.cpp: In function ‘int min(int*)’: 
prog.cpp:6: warning: ‘index’ may be used uninitialized in this function 
prog.cpp:6: warning: ‘minn’ may be used uninitialized in this function 

我做錯了嗎?或者它是編譯器錯誤?:) 謝謝:)

+0

您需要改進您的代碼。函數int min(int mas [])'太難看了。 – Stan

回答

15

你有宣佈他們,但不itialized他們。只需編寫int minn = 0, index = 0;以避免警告。如果你不初始化一個變量,它的默認值就是內存中那個位置的任何東西;通常是垃圾。

的事情是,如果num爲負,則既不的for循環在你min()功能將執行,所以minnindex不會被賦值。 if(i == num)測試也不會突破功能,並防止這種情況發生。所以函數的最後兩行將會有完全未定義的結果。

雖然有些時候確實沒有一個路徑可以使用未初始化的變量,有時編譯器不夠聰明,無法找出所有的細節。給他們一個初始值以避免警告。

+0

這不是他的問題。爲什麼編譯器抱怨未初始化,儘管(據他說)除非已初始化,否則沒有可用的路徑? – dascandy

+3

但有一個路徑不是所有的都被初始化,就像num == -1一樣。 –

+0

@波佩爾森,很好的建議,我已經更新了答案。 – ptomato

1

假設您傳遞的整個數組都是0.兩個循環都短路並且從不執​​行,minn和index都未初始化。

現在,如果發生這種情況,應該發生什麼?將變量設置爲完成這一點的值。

2

聲明!=初始化。當你聲明它們時,變量具有隨機值。只需將它們初始化爲合理的值,如索引爲-1,並將minn初始化爲INT_MAX。

2

可是你有沒有初始化它們:)))) EX:int i,minn=0,index=0;想象一下,你通過num,等於0,在結束時,你會被返回的minn未初始化的價值,只是,你會設置mas[unknown_number]=0;這將前可能會導致您的應用程序崩潰,因爲您將引用最有可能超出範圍的內存。您應該在開始時進行檢查,如if(num<1)return -1;

0

正如您在您的評論中所說的,是的,您的聲明瞭您的變量,但您尚未初始化它們。初始化一個變量意味着給它一個值。所以在這種情況下,你已經告訴編譯器你想創建三個整數,但是你沒有告訴它你想在這些整數中存儲什麼值。如果對於通過函數的每一個可能的路徑,index和minn都被賦予一個值,那就沒問題了,但是這裏的問題是函數中有一個路徑,minn和index永遠不會被初始化。首先,在這裏:

for(i=0;i<num;i++) 
{    
    if(mas[i]!=0)minn=mas[i]; 
    break;   
} 

如果你有一個零數組,那麼minn永遠不會初始化爲一個值。

再往:

for(i=0;i<num;i++) 
    if(mas[i]!=0 && minn>mas[i])   
    { 
     minn=mas[i]; 
     index=i; 
    } 

首先,如果你有爲零的數組,還有什麼是在美國明尼蘇達州的價值?沒有價值。您要求編譯器將mas [i]與不存在的數字進行比較。此外,如果mas [i]總是等於零呢?那麼現在你不要初始化minn或索引。然而,在函數結束時,你試圖使用index的值從數組amd中得到一個整數,然後你返回minn(它仍然沒有任何東西)。

這就是你從編譯器中得到的問題。它可以看到這種潛在的結果,並警告你,由於這些整數從來沒有得到價值,你的功能可能會被破壞。爲了解決這個問題,做一下其他人提出的建議,讓index和minn在開始時等於零。