码迷,mamicode.com
首页 > 其他好文 > 详细

结构体指针内存——指针数组——字符串指针内存申请

时间:2014-08-03 15:21:35      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   数据   2014   ar   size   

前几天用的结构体,结构体内还包含有结构体指针和数组以及指向字符串的指针,发现自己对这方面的东西还很容易犯错,故现在讲其中容易出错的地方写出来,分享给大家也方便自己日后查看。


typedef struct {
	char name[50];
	char job[50];
	int age;
	int people_id;


} peopleInfo;


typedef struct {


	bool typeAdd;
	bool typeDel;
	int length;
	
	peopleInfo *info;
	char buildDate[64];
	char lastDate[64];
	char valueStr[256];
} peopleObj;

上面就是两个结构体,peopleObj结构体中包含有上一个结构体的指针和一些数组(开始我在这里不是用的数组,而是用的指针,如char *lastDate,  char * valueStr,为什么最后改为数组,最后再讨论)


peopleObj* meGlobal;


如果有上面的指针定义,一定要为指针申请内存,在这里我使用

meGlobal= (peopleObj *)malloc(sizeof(peopleObj));这里的内存申请使用c标准库的malloc申请。char为1个字节,int为4个字节,指针info为4个字节,所以不算是那两个bool类型的,共为256+64+64+4+4=392个字节。bool类型的c++没有规格为多大,自己可以查下资料,4版的c++ primer上是没有规定的,估计和编译器有关。

这里特别注意在申请内存的时候只为peopleInfo *info;中的info指针申请了4字节的内存,peopleInfo结构体中的变量没有内存,如果需要使用则须为它们申请内存,如:

meGlobal->info = (peopleInfo *)malloc(sizeof(peopleInfo)*10);这样就可以使用info下的变量了,不会报错。


现在讲下为什么后来改使用数组:

开始我是这样定义结构体的:


typedef struct {
	char *name;
	char *job;
	int age;
	int people_id;


} peopleInfo;


typedef struct {


	bool typeAdd;
	bool typeDel;
	int length;
	
	peopleInfo *info;
	char *buildDate;
	char *lastDate;
	char *valueStr;
} peopleObj;


在结构体内,有很多数据我事先是不确定的,故开始我使用指针指向字符串。

同上面一样,在开始初始化meGlobal= (peopleObj *)malloc(sizeof(peopleObj));时,只为那些指针申请了内存,指针指向的内容并没有内存,故我又使用:


meGlobal->info->job = (char *)malloc(sizeof(char)*50);

meGlobal->info->name = (char *)malloc(sizeof(char)*50);


meGlobal->buildDate=(char *)malloc(sizeof(char)*64);
meGlobal->lastDate=(char *)malloc(sizeof(char)*64);
meGlobal->valueStr=(char *)malloc(sizeof(char)*256);


对于上面的内存申请都是估计的最大,所以存在很多的内存浪费,这里先不讨论。但是若是要使用必须做类似的申请内存,否则指针指向的内容没有内存空间。在后面的程序处理中,如果用到了上面的指针如果指向了其他内存,一定要注意其他内存在某段程序中是否被释放,如果被释放,那开始使用的指针就是野指针没有指向,如果你没有注意到这点,当又把指针直接拿去用就会出现崩溃,所以要在做它用之前为他申请内存或让它指向一段内存,这样才不会出错。


对于指针的使用一定要谨慎,我就是嫌麻烦而且开始出错了,故选用数组。当数组开始定义的时候就有一段内存就被分配给它了。


关于指针和数组,c++ primer现在都不推荐,推荐尽量使用vector容器和迭代器代替。指针还有很多很复杂的用途,慢慢学习吧。

如果有错还请指出,相互学习。



结构体指针内存——指针数组——字符串指针内存申请,布布扣,bubuko.com

结构体指针内存——指针数组——字符串指针内存申请

标签:style   blog   color   使用   数据   2014   ar   size   

原文地址:http://blog.csdn.net/jiangnanyidiao/article/details/38356501

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!