在結構中一般使用字符數組來存儲字符串,那么是否可以用指向字符的指針代替字符數組?
看如下聲明:
#define LEN 20
Struct names{
Char first[LEN];
Char last[LEN];
};
?
Struct pnames{
Char * first;
Char * last;
};
答案是可以這樣聲明,但是可能會遇到麻煩,你得理解其含義.考慮以下的代碼:
Struct names veep={“Talia”, “Summers”};
Struct pnames treas={“Brad”, “Fallingjaw”};
Printf(“%s and %s\n”,veep.first,treas.first);
這是一段正確的代碼,也能正常運行,但是請思考下字符串存儲在哪里?對于
Struct names
變量
veep
來說,字符串存儲在結構內部;這個結構共分配了
40
字節來存放兩個字符串.然而,對于
Struct pnames
變量
treas
來說,字符串存儲在編譯器存儲字符串常量的任何地方.這個結構存放的只是兩個地址而已,在系統中它總共占用
8
個字節.
Struct pnames
結構不為字符串分配任何存儲空間.它只適用于在另外的地方已經為字符串分配了空間.簡單的說,
Struct pnames
結構中的指針應該只用來管理那些已經創建的而且在程序其他地方已經分配過空間的字符串.
再來看看這個限制條件在什么情況下升級為問題:
Struct names accountant;
Struct pnames attorney;
Puts(“Enter the last name of your accountant:”);
Scanf(“%s”,accountant.last);
Puts(“Enter the last name of your attorney”);
Scanf(“%s”,attorney.last);
語法方面來說,這段代碼沒有問題,但是考慮下把輸入存儲到哪里了?對會計師來說,他的名字存儲在
accountant
變量的最后一個成員中;這個結構有一個用來存放字符串的數組.對律師來說,
scanf()
把字符串放到由
attorney.last
給出的地址中.因為這是個沒有初始化的變量,所有該地址可能是任何值,程序就可以把名字放在任何地方.
所以,我們如果需要一個結構來存儲字符串,請使用字符數組成員.存儲字符指針有它的用處,但也有被嚴重誤用的可能.
?
?
?
posted on 2006-11-10 16:15
matthew 閱讀(488)
評論(0) 編輯 收藏 所屬分類:
閱讀筆記