结构中的字符数组和字符指针

作者:追风剑情 发布于:2020-1-21 15:26 分类:C

#define LEN 20
//字符数组
struct names {
//分配LEN个char存储空间
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);

在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),他的名储存在accountant结构变量的last成员中,该结构中有一个储存字符串的数组。对于律师(attorney),scanf()把字符串放到attorney.last表示的地址上。由于这是未经初始的变量,地址可以是任何值,因此程序可以把名放在任何地方。如果走运的话,程序不会出问题,至少暂时不会出问题,否则这一操作会导致程序崩溃。实际上,如果程序能正常运行并不是好事,因为这意味着一个未被觉察的危险潜伏在程序中。

      因此,如果要用结构储存字符串,用字符数组作为成员比较简单。用指向char的指针也行,但是误用会导致严重的问题。

标签: C语言

Powered by emlog  蜀ICP备18021003号   sitemap

川公网安备 51019002001593号