天天看點

字元指針 不等于 字元數組

最近程式設計遇到一些關于指針的低級錯誤:

隻是申請了一個字元類型指針,就以為可以用來存儲其他函數傳回來字元串,實際情況是:

指針是申請了,但是隻是有存儲指針的空間,而實際指針位址指向的地方,我們是不知道的,它是個随機的,每次運作都會不一樣,好像這也就是所謂的野指針了。也就是這個野指針指向位址的内容是沒有任何保障的,而且很可能是自己沒有權限通路,或者是那個地方是被别的程式所使用的。自己這樣亂用的話,就會導緻将原來存在的,很有可能是其他程式的有效資料覆寫掉了,那麼肯定最後容易出錯。

關于此處的申請的指針,具體舉例:

申請一個字元類型的指針,系統給了個位址0x1234,存儲你這個字元指針,記住,不論是什麼類型的指針,根本上都是指針,一般也就是占用4個位元組。而你這個指針的值,由于開始沒有初始化,是個野位址,假如值是0x6789,此時調用一個函數,将這個指針傳這個函數,然後去進行一系列處理後,原意是在那個函數中将一個字元串拷貝到這個指針位置的,代碼實作,也就是将函數中的字串的首位址指派給這個字元指針,看似得到我們想要的了,但是實際情況是,函數内的字元串,在函數調用結束後,就消失了,另一些函數中,是用字元拷貝到我們這個字元指針的對應位置的,但是實際産生的效果卻是,将用于存儲字元指針的位址傳給了函數,然後往其後一段空間拷貝字元,這極有可能修改了其他的有效資料,即使沒有發生這個情況,那麼傳回時候,也極有可能你這個字元指針其後的空間,是被其他目前函數的變量占據着,也就将上述的傳回的字串沖掉了,總之這種是極度危險的做法,錯誤的做法。

正确的做法應該是,在申請的時候,申請一個字元數組,然後将數組首位址,也就是字元數組名傳給那個函數,然後經過其處理之後,将對應字元拷貝到你這個字元數組中,這樣才能實作字元串的真正傳回。

(疑問:為何編譯器不給自己初始化呢?我估計是如果每個都讓編譯器初始化,那麼工作量很大,最主要應該還是這些工作,應該由程式設計人員自己懂得自己要做什麼,要自己去初始化)

繼續閱讀