2014-02-27 99 views
4

我工作的一個項目crypter並試圖編譯程序時遇到了以下錯誤。錯誤C4703:可能未初始化本地指針變量「pNamesPtr」使用

main.cpp中(520):錯誤C4703:潛在的未初始化的局部指針 變量 'pNamesPtr' 用
==========生成:0成功,失敗1,0先進-date,0已跳過==========

 DLLNAMES[i].UsedAlready = 0; 
    } 


    *dwOutSize = (DWORD)pNamesPtr - (DWORD)pBuffer;//*<----is line 520 of error 
    *dwImportsSize = *dwOutSize - *dwIATSize;  
    return pBuffer; 
} 
#pragma pack(1) 
typedef struct 

有人可以幫助我這個錯誤?你需要更多的代碼纔能有一個好的答案?

+1

有沒有辦法,我們可以告訴你,如果初始化與否。 – chris

+0

你如何聲明'pNamesPtr'。添加相同的代碼.. – HadeS

回答

2

這意味着

  • 你不初始化pNamesPtr在聲明它,所以它有一個無效的值開始;和
  • 在使用它之前,編譯器無法確定您將爲其分配一個有效值。

檢查從申報到使用點的所有代碼路徑。他們是否都指定了一些對變量有意義的東西?如果不是的話,修復它,讓他們這樣做。

如果他們這樣做了,你確信你正確地分配給它,你可以簡化代碼,這樣很明顯的編譯器,它是什麼?

如果一切都失敗了,那麼你可以通過它來初始化或nullptr在初始化一些其他的默認值沉默的編譯器。但只有在你確定你的代碼是正確的時候纔會這樣做 - 編譯器通常很擅長髮現這樣的錯誤。

5

這個警告並不總是一個錯誤,有時它只是優化的結果。由於它在你的代碼中,你不知道這是什麼,它實際上可能是一個錯誤。

例如,如果我寫:

int i; 

if (this_and_that) 
    i = 5; 

if (whatever) 
    printf("%d\n", i); // <--- this may give a potential blahblah warning 

如果你正在優化,那麼你可能知道的whatever的值始終爲true時this_and_that值爲true,所以如果printf被稱爲然後i已經保證被初始化,但編譯器通常無法弄清this_and_thatwhatever之間的關係,這就是爲什麼你會得到警告。對此警告的一種可能的快速修復是將變量初始化爲您聲明它的默認值。在我看來,保留初始值是一個不好的做法,也是很多錯誤的來源。

+0

當我不小心時,這種情況發生在我身上 - 如果你有一個if-else if-else類型的設置,也就是這樣,你知道一個變量/指針將被設置,因爲你有一個'else',但由於它們全部只是有時被調用,所以編譯器可能會抱怨 – chrisb2244

+1

@ chrisb2244是的,如果我們想概括我的語句:如果你嘗試使用在變量初始化和變量使用之間的所有可能的代碼執行路徑上未初始化的變量。因此,任何用「jump/goto」生成代碼的控制流語句都可能導致這種情況,例如'switch'可以做同樣的事情,但是更具有異國情調的控制流程示例:從循環中斷開可能會導致這種情況,如果初始化的變量是在你的break語句之後的循環裏面... – pasztorpisti

+0

糾正我以前的評論:變量*聲明*和變量用法之間 – pasztorpisti

-1

把這個在你的代碼:

xtype *pNamesPtr = NULL 
+2

我認爲這個答案可以改進,不清楚它應該放在哪裏,而你不是用適當的格式突出顯示代碼。 – phaberest