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

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


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容器和迭代器代替。指针还有很多很复杂的用途,慢慢学习吧。

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



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值