在结构中一般使用字符数组来存储字符串,那么是否可以用指向字符的指针代替字符数组?
看如下声明:
#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 阅读(478)
评论(0) 编辑 收藏 所属分类:
阅读笔记