定义变量时一定要初始化
最近遇到一個(gè)問(wèn)題,在debug模式下怎么運(yùn)行結(jié)果都是正確的,而release時(shí)會(huì)出現(xiàn)一些詭異的問(wèn)題,但是問(wèn)題又詭異的很,比如我printf幾句無(wú)關(guān)痛癢的log信息,可能現(xiàn)象又對(duì)了。
只好在匯編模式下一行一行的跟下去,最終發(fā)現(xiàn)了問(wèn)題的所在。
問(wèn)題是這樣的,我有一處代碼用到了zlib的解壓:
int?uncompress(Bytef *?dest, uLongf *?destLen, const Bytef *?source, uLong?sourceLen);
因?yàn)橹皼](méi)用過(guò)也沒(méi)有仔細(xì)看參數(shù)傳遞規(guī)則,不知道deslen一定要傳入目標(biāo)buffer dest的大小,以為他只是一個(gè)返回值,于是就這樣調(diào)用了:
uLongf destLen;
uncompress(dest, destLen, ...);
這里犯了兩個(gè)錯(cuò)誤,一是沒(méi)有檢查uncompress的返回值(這里不怪我,因?yàn)槲艺{(diào)用的函數(shù)是前人在uncompress上封裝了一層,然后就沒(méi)返回值了)。然后呢,詭異的問(wèn)題就出現(xiàn)了:
VC的debug模式局部變量會(huì)默認(rèn)的賦值為0xcdcdcdcd,這是debug下正確的原因,因?yàn)閡ncompress會(huì)認(rèn)為我的傳入dest是足夠大的(事實(shí)上是剛剛夠,因?yàn)榻鈮褐拔揖椭肋@個(gè)buffer的大小),所以就高高興興地去解壓了,然后目標(biāo)buffer也足夠大不會(huì)越界,然后,然后就一切正常了...
而release下VC就不會(huì)給局部變量賦值了,然后呢,在調(diào)用的時(shí)候有時(shí)(對(duì),就是有時(shí),沒(méi)初始化,這個(gè)值就是隨機(jī)的!)就會(huì)發(fā)現(xiàn)目標(biāo)buffer dest的大小不夠用了,然后就調(diào)用失敗了,然后我調(diào)用的函數(shù)沒(méi)有返回值,然后認(rèn)為一切正常,然后dest里的值還是初始值,然后就效果不對(duì)了,然后就傻逼了...
歸根結(jié)底呢,是壞習(xí)慣的問(wèn)題,首先,應(yīng)該檢查返回值,這是前人的錯(cuò),我可以無(wú)恥的推卸掉,但是變量沒(méi)初始化的過(guò)錯(cuò)就是萬(wàn)萬(wàn)退不掉了,假使我即使不知道destLen要傳實(shí)際dest的大小,我把它初始化成0,那么至少會(huì)在debug的時(shí)候問(wèn)題就顯現(xiàn)出來(lái),不至于在release中無(wú)所適從,一個(gè)簡(jiǎn)單的問(wèn)題用了半天的時(shí)間才發(fā)現(xiàn)根結(jié)所在。
所以結(jié)論就是,定義變量時(shí)一定要初始化,哪怕看起來(lái)很無(wú)用很無(wú)聊,至少這樣會(huì)減少很多犯錯(cuò)的幾率!
轉(zhuǎn)載于:https://www.cnblogs.com/andyzhshg/archive/2012/10/31/2747896.html
總結(jié)
以上是生活随笔為你收集整理的定义变量时一定要初始化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Daily Scrum M2 10-29
- 下一篇: 显示Iframe指定位置