随笔 - 251  文章 - 504  trackbacks - 0
<2006年11月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

本博客系个人收集材料及学习记录之用,各类“大侠”勿扰!

留言簿(14)

随笔分类

收藏夹

My Favorite Web Sites

名Bloger

非著名Bloger

搜索

  •  

积分与排名

  • 积分 - 199893
  • 排名 - 286

最新评论

在结构中一般使用字符数组来存储字符串,那么是否可以用指向字符的指针代替字符数组? 看如下声明:

#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)  编辑  收藏 所属分类: 阅读笔记

只有注册用户登录后才能发表评论。


网站导航: