最近在做專案時遇到了乙個奇怪的問題。呼叫函式獲取被調函式返回的指標,獲取成功後解引用時偶爾會導致程式崩潰。
首先檢視原始碼,沒有發現明顯的問題。
這之後開始除錯,在除錯中發現被調函式的 return 語句處的指標值是正確的,賦值之後值發生了變化。
為了進一步確定問題,我做了如下嘗試:
複製被調函式的函式體,將其放到呼叫函式內部執行,再次觀察結果。這次問題沒有出現,檢視位址發現正常。
這時我可以確定應該是返回值傳遞過程中出現了問題。可是難道在此期間有人修改了返回值嗎?首先排除了這種可能,畢竟沒有其它執行流在同時執行。
最後發現原來是沒有包含足夠的標頭檔案導致返回值被截斷。如果是在 32 位機器上這個問題不會造成任何嚴重後果。編譯器猜測的 int 型返回值型別的長度與指標長度相同,不會產生截斷問題。在 64 位機器上這個問題也是偶然出現的,如果分配的記憶體的位址區域沒有超過 32-bit 長度,仍舊不會產生問題。
這個問題說明了標頭檔案包含的重要性,也體現了工程結構中不合理的標頭檔案包含結構可能會造成的嚴重後果,需要在前期的設計中就注意規避這個問題!
標頭檔案包含問題
今天在寫 時,用到了五六個資料夾,但是在包含標頭檔案的時候不停的在報錯,因此特地重溫了下標頭檔案的包含 標頭檔案包含符號分為兩種 第一種為 先在當前工程儲存目錄下尋找,再去系統存放目錄取尋找,常用於自定義標頭檔案 第二種為 直接在系統目錄下尋找,未找到則返回錯誤,不會在當前目錄下尋找 因此,當我們需...
標頭檔案互相包含問題
當我們有兩個類的標頭檔案互相包含時,如果出現乙個類中有另乙個類的物件時,vs就會報這樣的錯error c4430 缺少型別說明符 假定為 int。test2.h ifndef test2 h define test2 h include include test1.h using namespace...
標頭檔案路徑包含問題
標頭檔案包含兩種,系統標頭檔案和自定義標頭檔案,系統標頭檔案不說了,格式統一,自定義標頭檔案在包含的時候要注意路徑,其實是標頭檔案與主檔案的相對位置關係的問題。ps 另外,linux和windows下也有所區別。舉4個例子,應該就能看明白了。一.這種情況下,在main.c中包含標頭檔案如下 incl...