程式片段 :
void mstrcat(char *s, char *t)這是乙個字元陣列連線的函式 .
(一)在測試程式中宣告如下 :
char a = "abcd";分別在gcc3.4.4和vc6.0後,得出2種不同的結果:char b = "ef";
char s = "ghijklmnopqrstuvwxyz";
char *c;
char *d;
mstrcat(b, s);
/* 連線後的b */
printf("after:%s\n", b);
/* a */
printf("after:%s\n", a);
/* 各字元陣列的首元素位址 */
printf("%d\n", (int)a);
printf("%d\n", (int)b);
printf("%d\n", (int)s);
gcc:
after:efghijklmnopqrstuvwxyz
after:uvwxyz
22ccd0
22ccc0
22cca0
得出結論(無異常產生):
每個字元按乙個位元組儲存,並且相鄰字元陣列按照位址下降來儲存,而乙個陣列內元素按照位址上公升來儲存.
gcc依照16個位元組對齊原則進行對齊處理(即不足16個位元組的陣列,按16個位元組進行對齊儲存)
vc6.0:(出現異常)
after:efghijklmnopqrstuvwxyz
after:ijklmnopqrstuvwxyz
1245048
1245044
1245020
得出的結論:
vc6.0:
每個字元按乙個位元組儲存,並且相鄰字元陣列按照位址下降來順序儲存,而乙個陣列內元素按照位址上公升來儲存.
vc6.0依照4個位元組對齊原則進行對齊處理(即不足4個位元組的陣列,按4個位元組進行對齊儲存)
總結:
總之,這種處理方式是種不安全的處理方式,是否出現異常取決於是否有足夠的已申請空間的支援.
在gcc中未出現異常是因為gcc按照16位元組的對齊方式,即32位元組足以容納連線後的字元陣列b.
而在vc中出現異常是因為vc按照4位元組的對齊方式,4位元組不能容納b.
可預見的是:如果當b的字元陣列長度大於32時,gcc中也會出現異常.
(二)在測試程式中宣告如下 :
同樣在測試程式中如果宣告如下
char *c;那麼,在gcc和vc(版本同上)中的結果如下:char *d;
c = "abcd";
d = "efghi";
printf("%d\n", (int)c);
printf("%d\n", (int)d);
mstrcat(c, d);
printf("%s\n", c);
gcc(出現異常):
402000
402005
得出結論:
對於未指定所指物件的指標,其位址是編譯器任意指定的,而當指定其所指物件時,指標則儲存的是所指物件的首位址(例如,指標c指向的是字元陣列"abcd"的首 位址),由於字元陣列之間順序存放,所以d指向的是5個位元組("abcd"占用5個位元組儲存空間)後的位置,這裡我們的看到的位址是公升序的.
vc(出現異常):
4333604
4337624
得出結論:
對於vc而言,其相鄰指定給指標的字元陣列並非順序儲存,但指標指向的位置仍然是所指物件的首位址.
出現異常的原因是:
顯然對於d字元陣列所需要的連續儲存空間c是不滿足的(不能操作未申請的儲存空間).
ps.在(一)中,即使使用c語言的標準字串函式strcat,strcat(b,s)也會出現異常,可見標準函式也沒有使用重新申請新空間的方式處理.
C語言中的字元型陣列
本篇部落格的 是在vc6.0 中實現 一看部落格標題好像是在說字元陣列的,實際上在c語言中,字元型陣列包括字元陣列和字串陣列 陣列知識並不是很難的知識,但是一些細節問題需要注意,繁瑣的概念問題不在過於強調,只強調一些易錯易忽視的一些問題 字元陣列 概念 顯然是由一些字元組成的陣列 例如 定義乙個字元...
C語言中字元陣列庫函式
以下內容摘自 c程式設計教程 美 h.m.deitel p.j.deitel著,薛萬鵬等譯,機械工業出版社。void memccpy void dest,const void src,int c,size t n 從sr 所指向的物件複製 個字元到 est所指向的物件中。如果複製過程中遇到了字元c則...
C語言中的陣列
c語言陣列 一 陣列的概念 用來儲存一組資料的構造資料型別 特點 只能存放一種型別的資料,如全部是int型或者全部是char型,陣列裡的資料成為元素。二 陣列的定義 格式 型別 陣列名 元素個數 舉例 儲存5個人的年齡 int agrs 5 在記憶體中開闢4x5 20個位元組的儲存空間 可以在定義陣...