double類型return後數據死活不對?致敬你親手寫的bug

事情發生在11月23日

我還有最後一個問題單:計算cpu的使用率。網上的輪子一拿一個,代碼中定義了一個用於計算cpu使用率的函數cal_cpuoccupy(),返回值爲double,具體原型爲:

double cal_cpuoccupy (CPU_OCCUPY *o, CPU_OCCUPY *n)

剩下的工作就是調用,然後下班,一切這麼的輕鬆、自然。但是事情往往沒那麼簡單,調用時發現:double cpu = cal_cpuoccupy(),return的結果cpu,%f打印出來死活不對,是一個亂掉的數字。。。我找了我能想到所有可能的原因,沒有一點進展,找的我懷疑人生


11月24日 我繼續調試這個問題,我發現將變量double cpu作爲結果參數傳入cal_cpuoccupy(),結果是正確的的,打印地址也都是對的,修改後的原型爲:

double cal_cpuoccupy (CPU_OCCUPY *o, CPU_OCCUPY *n, double *s)

但是返回值依舊不正確,我坐在電腦前,一頓聯想、猜測,傳參結果正確,說明不是cpu調度、沒加鎖的問題。

在網上看到一句話給了我啓發:函數沒有寫返回類型,那麼默認爲int。

我馬上寫了個函數測試了下,gcc編譯器會報警告:return type defaults to ‘int’,我的測試函數定義爲func { ... },看到這我就想,我的函數有定義,但是沒有聲明,那麼編譯器會不會把這個函數返回值默認設置爲int呢,有可能,所以我在代碼中,調用前加入了extren聲明瞭外部函數,試了之後發現,函數的返回值終於正確了!

確實是這樣,真的是這樣?我又想到了,如果是這樣,那麼編譯和鏈接肯定會對函數有什麼不一樣的操作,應該在深入瞭解一下,果然又發現一句話:

        C語言並不強行要求函數在使用前先聲明。如果你在代碼中寫了一個未聲明的函數,那麼編譯器編譯到這裏時會假設這個函數的參數列表就是你使用它的這些參數類型,而返回值爲int型,如果之後的編譯鏈接中發現這個函數的真正定義並不是編譯器假設的那樣,再報錯。

看來是這個樣子了。老老實實的遵守規則,可以讓自己多活幾年。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章