下面的例子定义了两个结构,由于成员中存在字符串,所以结构一使用了字符数组,而结构二使用字符指针。
#include <stdio.h>
#define LEN 20
struct info {
char first[LEN];
char last[LEN];
int age;
};
struct pinfo {
char * first;
char * last;
int age;
};
int main()
{
struct info one = {"Opw", "Cde", 22};
struct pinfo two = {"Tydu", "Gqa", 33};
printf("%s %s is %d years old.n", one.first, one.last, one.age);
printf("%s %s is %d years old.n", two.first, two.last, two.age);
return 0;
}
代码运行正常。但是对于struct pinfo变量 two来说,存在隐患。因为two中的两个字符串存储在文字常量区。而在结构中存放的只是两个地址而已。
printf("one.first's size: %dn",sizeof(one.first));
printf("two.first's size: %dn",sizeof(two.first));
结果:
one.first's size: 20
two.first's size: 4
所以pinfo结构中不为字符串分配任何存储空间。它只适用于在另外的地方已经为字符串分配了空间的情况,且一旦该地址中的内容改变,则结果不可预知。
可以这样使用pinfo,使用malloc()动态的分配空间,并使字符指针指向新分配的空间,再将目标字符串内容复制到字符指针指向的地址空间。当使用完数据后,再free()。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 20
struct pinfo {
char * first;
char * last;
int age;
};
void setinfo(struct pinfo * ps, char * first, char * last, int age);
void clean(struct pinfo * ps);
int main()
{
char fname[LEN] = "Wqc";
char lname[LEN] = "Oed";
int age = 33;
struct pinfo two;
setinfo(&two,fname,lname,age);
printf("%s %s is %d years old.n", two.first, two.last, two.age);
//...other operations
clean(&two);
//...other operations
return 0;
}
void setinfo(struct pinfo * ps, char * first, char * last, int age)
{
ps->first = (char *) malloc (strlen(first) + 1);
strcpy(ps->first, first);
ps->last = (char *) malloc (strlen(last) + 1);
strcpy(ps->last, last);
ps->age = age;
}
void clean(struct pinfo * ps)
{
free (ps->first);
free (ps->last);
}
本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/100642
版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明!