前几天用的结构体,结构体内还包含有结构体指针和数组以及指向字符串的指针,发现自己对这方面的东西还很容易犯错,故现在讲其中容易出错的地方写出来,分享给大家也方便自己日后查看。
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容器和迭代器代替。指针还有很多很复杂的用途,慢慢学习吧。
如果有错还请指出,相互学习。
结构体指针内存——指针数组——字符串指针内存申请