C語言中字元陣列的儲存

2021-08-29 19:41:28 字數 2153 閱讀 4520

程式片段 :

void mstrcat(char *s, char *t)

這是乙個字元陣列連線的函式 .

(一)在測試程式中宣告如下 :

char a = "abcd";

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);

分別在gcc3.4.4和vc6.0後,得出2種不同的結果:

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;

char *d;

c = "abcd";

d = "efghi";

printf("%d\n", (int)c);

printf("%d\n", (int)d);

mstrcat(c, d);

printf("%s\n", c);

那麼,在gcc和vc(版本同上)中的結果如下:

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個位元組的儲存空間 可以在定義陣...