要先有字元陣列,字元指標才能使用

因為知道指標可以指向字串常數,所以在使用scanf和gets等函數時也想如法泡製,這些函數的確是可以傳入字元指標型態的參數,但實際操作卻遇到了一些麻煩,一直呈現程式執行中斷的畫面,如下圖。

原本的程式裡只有宣告一個字元指標,後來發現如果再新增一個字元陣列的話,原本的scanf就可以正常執行。心想,是因為一個程式裡要同時宣告一個字元陣列和一個字元指標,這個字元指標才能正常執行嗎?

後來發現並不是這樣,因為當把scanf換成gets時就不行了,這時程式裡一樣存在一個字元陣列和一個字元指標。此時靈機一動,把字元陣列的尺寸變大,例如,char line[10]變成char line[15],一開始不行,試到一個數字之後就又可以正常執行了。

在這裡得到一個結論:

字元陣列的宣告會影響到字元指標的初始位址,因為剛宣告的字元指標並不是空值,它是不確定的值,也就是說一開始是隨機指向記憶體的任意位置,包括已經有資料的區塊,如果一開始指標指向的是空的區塊,那麼scanf等函數便可以正常操作;但如果一開始指標指向的就是已經被佔用的記憶體空間,這時候要存取這塊記憶體就會產生問題,在xp裡頭就會出現上圖所示的畫面。

原本是因為想要節省那幾byte的記憶體空間才堅持要用指標的方式來儲存輸入的字串,經過上述測試的結果之後,發現最安全的方式還是必須提供一個確定可用的記憶體空間才不會出現干擾。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Proudly using Dynamic Headers by Nicasio WordPress Design