C 字元陣列越界問題的乙個案例分析

2022-06-05 03:51:11 字數 1451 閱讀 8348

我的學生yang1067155909給我來信,說的是c++第11周專案3 - cemployee類繼承自cperson類中的乙個細節:

賀老師:

老師,m_szdepartment=new char[strlen(department)+1];為何需要+1呢?在測試裡去掉+1後和這個效果一樣啊,不太明白……求指教……

學生,楊騰飛

我回答:

要給'\0'占個座。是用別人的地盤(越界的部分)儲存了自己的資訊了吧,不定哪次人家要用,執行結果就不一樣了。這恰是最危險的問題。

他繼續追問:

可是在定義字元陣列時,比如a[4]時,可以輸入5個字元,那麼這個陣列的'\0'的位置是不是也占用了別人的?

我為這個機靈的同學的問題感到激動,讀程式,切忌只是讀,要會提問題。能自己提出問題,就一定能學好。老師給出解答,接著再提出新問題,自己解答,或再問老師,這就是交流。為著學生提出了好問題,作為老師,我驕傲。我的回答是:

你提的問題不是一般的好,見我新發表的博文談這個問題。

下面就是我對這個問題的解答。不妨針對問題設計乙個程式試一試。程式是:

[cpp][/cpp]view plain

copy

print

?#include 

using namespace std;

int main()

親愛的讀者,讀這篇文章時,請不要只「讀」,開啟你熟悉的程式設計環境,邊讀邊執行。你會發現什麼?

輸入abcd然後回車,輸出是abcd。cout<[cpp][/cpp]view plain

copy

print

?#include 

using namespace std;

int main()

執行的任務交給讀者了,觀察輸入3個字元、4個字元、5個字元的情形,也可以在多個平台上試試,針對結果想想為什麼。用單步執行的手段跟蹤一下記憶體中的資料儲存,是個強烈建議的辦法。

下面是為a和b陣列輸入3個字元後(分別是abc和hij),利用單步執行看到的結果:

下面是為a和b陣列輸入5個字元後(分別是abcef和hijkl),利用單步執行看到的結果:

從中看出,vc++6.0中,先定義的a陣列的位址大於後定義的陣列b的位址,本來為a中輸入了abcde,侵占了別人的地盤,隨後為b輸入hijkl,侵占的就是a的地盤,b[4]即a[0]為l,b[5]即a[1],儲存的是'\0'!

下圖是在codeblocks下,用同樣的輸入除錯截出的結果,結果一樣:

接下來,再給乙個程式,其實就是將輸入a和b的順序換了一下:

[cpp][/cpp]view plain

copy

print

?#include 

using namespace std;

int main()

執行結果會是怎樣?讀者你自己說吧。不要忘了,用除錯工具這個法寶解除你的疑惑。

文章**

C 字元陣列越界問題的乙個案例分析

我的學生yang1067155909給我來信,說的是c 第11周專案3 cemployee類繼承自cperson類中的乙個細節 賀老師 老師,m szdepartment new char strlen department 1 為何需要 1呢?在測試裡去掉 1後和這個效果一樣啊,不太明白 求指教 ...

關於溝通問題的乙個案例

我們需要測試乙個安裝包,安裝包中包含了資料庫公升級指令碼,這是測試的乙個重點。我們以前能訪問客戶的一台伺服器,並且在5.2號對資料庫進行了備份,但是在5.3號手動對資料庫進行了一點修改,這些修改是不包含的備份中的。而我們現在不能遠端桌面連線到客戶的伺服器了,這樣我們就沒有乙個真實的資料庫來測試公升級...

排序字串的乙個案例

首先我們必須了解一下兩種宣告的不同點 int pz 2 pz指向兩個包含int型別值的陣列 等同於乙個指向陣列的指標,該陣列內含兩個int型別值 int pz 2 另一種寫法int pax 2 pax是乙個內含兩個指標元素的陣列,每個元素都是int的指標 include include includ...