结构体的对齐方式以及结构体嵌套指针的使用方法
结构体数组
定义结构体数组的方法很简单,同定义结构体变量是一样的,只不过将变量改成数组。或者说同前面介绍的普通数组的定义是一模一样的,如:structSTUDENTstu〔10〕;
这就定义了一个结构体数组,共有10个元素,每个元素都是一个结构体变量,都包含所有的结构体成员。defineCRTSECURENOWARNINGSincludestdio。hincludestdlib。hincludestring。hincludetime。htypedefstructTeacher{charname〔50〕;charname;intage;}Teacher;intmain(){Teachera〔3〕{{a,11},{b,12},{c,13}};静态Teachera2〔3〕{aa,13,bb,12,cc,13};for(inti0;i3;i){printf(s,d,a2〔i〕。name,a2〔i〕。age);}intb〔3〕{0};intpB(int)malloc(3sizeof(int));free(pB);Teacherp〔3〕Teacherp(Teacher)malloc(3sizeof(Teacher));if(pNULL){return1;}charbuf〔50〕;for(inti0;i3;i){sprintf(buf,nameddd,i,i,i);strcpy(p〔i〕。name,buf);p〔i〕。age20i;}for(inti0;i3;i){printf(第d个:s,d,i1,p〔i〕。name,p〔i〕。age);}printf();if(p!NULL){free(p);pNULL;}return0;}结构体嵌套一级指针defineCRTSECURENOWARNINGSincludestdio。hincludestdlib。hincludestring。hincludetime。htypedefstructTeacher{charname;intage;}Teacher;showTeacher(Teacherq,intn){for(inti0;in;i){printf(s,d,q〔i〕。name,q〔i〕。age);}}freeTeacher(Teacherq,intn){for(inti0;in;i){if(q〔i〕。name!NULL){free(q〔i〕。name);q〔i〕。nameNULL;}}if(q!NULL){free(q);qNULL;}}TeachergetMem(intn){Teacherq(Teacher)malloc(sizeof(Teacher));Teacherq〔3〕charbuf〔30〕;for(inti0;in;i){q〔i〕。name(char)malloc(30);sprintf(buf,nameddd,i,i,i);strcpy(q〔i〕。name,buf);q〔i〕。age20i;}returnq;}TeachergetMem2(Teachertemp,intn){if(tempNULL){return1;}Teacherq(Teacher)malloc(sizeof(Teacher));Teacherq〔3〕charbuf〔30〕;for(inti0;in;i){q〔i〕。name(char)malloc(30);sprintf(buf,nameddd,i,i,i);strcpy(q〔i〕。name,buf);q〔i〕。age20i;}tempq;return0;}intmain(){charnameNULL;name(char)malloc(30);strcpy(name,aa);printf(names,name);if(name!NULL){free(name);nameNULL;}1Teachert;t。name(char)malloc(30);strcpy(t。name,s);t。age22;printf(namesaged,t。name,t。age);if(t。name!NULL){free(t。name);t。nameNULL;}2TeacherpNULL;p(Teacher)malloc(sizeof(Teacher));pname(char)malloc(30);strcpy(pname,ss);page22;printf(namesaged,pname,page);if(pname!NULL){free(pname);pnameNULL;}if(p!NULL){free(p);pNULL;}3TeacherqNULL;qgetMem(3);intret0;retgetMem2(q,3);if(ret!NULL){returnret;}showTeacher(q,3);freeTeacher(q,3);pNULL;return0;}结构体嵌套二级指针defineCRTSECURENOWARNINGSincludestdio。hincludestdlib。hincludestring。hincludetime。h一个导师有若干学生typedefstructTeacher{intage;charstu;二维内存}Teacher;n1老师个数n2每个老师带的学生数intcreateTeacher(Teachertemp,intn1,intn2){if(tempNULL){return1;}Teacherq(Teacher)malloc(sizeof(Teacher)n1);Teacherq〔3〕for(inti0;in1;i){q〔i〕。stu(qi)stuq〔i〕。stu(char)malloc(sizeof(char)n2);charstu〔3〕for(intj0;jn2;j){q〔i〕。stu〔j〕(char)malloc(30);charbuf〔30〕;sprintf(buf,namedddd,i,i,j,j);strcpy(q〔i〕。stu〔j〕,buf);}q〔i〕。age20i;}tempq;return0;}voidshowTeacher(Teacherq,intn1,intn2){if(qNULL){return;}for(inti0;in1;i){printf(〔aged〕,q〔i〕。age);for(intj0;jn2;j){printf(s,,q〔i〕。stu〔j〕);}printf();}printf();}voidsortTeacher(Teacherp,intn){if(pNULL){return;}Teachertemp;for(inti0;in1;i){for(intji1;jn;j){if(p〔i〕。agep〔j〕。age)降序{tempp〔i〕;p〔i〕p〔j〕;p〔j〕temp;}}}}voidfreeTeacher(Teachertemp,intn1,intn2){if(tempNULL){return;}Teacherqtemp;for(inti0;i3;i){for(intj0;j3;j){if(q〔i〕。stu〔j〕!NULL){free(q〔i〕。stu〔j〕);q〔i〕。stu〔j〕NULL;}}if(q〔i〕。stu!NULL){free(q〔i〕。stu);q〔i〕。stuNULL;tempNULL;}}if(q!NULL){free(q);qNULL;}}intmain(){charnameNULL;charname〔3〕intn3;name(char)malloc(sizeof(char)3);for(inti0;in;i){name〔i〕(char)malloc(30);strcpy(name〔i〕,aaa);}for(inti0;in;i){printf(s,name〔i〕);}for(inti0;in;i){if(name〔i〕!NULL){free(name〔i〕);name〔i〕NULL;}}if(name!NULL){free(name);nameNULL;}1Teachert;t。stu〔3〕chart。stu〔3〕intn3;t。stu(char)malloc(sizeof(char)3);for(inti0;in;i){t。stu〔i〕(char)malloc(30);strcpy(t。stu,aaa);}for(inti0;in;i){printf(s,t。stu〔i〕);}for(inti0;in;i){if(t。stu〔i〕!NULL){free(t。stu〔i〕);t。stu〔i〕NULL;}}if(t。stu!NULL){free(t。stu);t。stuNULL;}2TeacherpNULL;pstu〔3〕p(Teacher)malloc(sizeof(Teacher));chart。stu〔3〕intn3;pstu(char)malloc(sizeof(char)3);for(inti0;in;i){pstu〔i〕(char)malloc(30);strcpy(pstu,aaa);}for(inti0;in;i){printf(s,pstu〔i〕);}for(inti0;in;i){if(pstu〔i〕!NULL){free(pstu〔i〕);pstu〔i〕NULL;}}if(pstu!NULL){free(pstu);pstuNULL;}if(p!NULL){free(p);pNULL;}3TeacherqNULL;intret0;retcreateTeacher(q,3,3);Teacherq〔3〕q〔i〕。stu〔3〕printf(排序前);showTeacher(q,3,3);sortTeacher(q,3);printf(排序后);showTeacher(q,3,3);freeTeacher(q,3,3);return0;}结构体的深拷贝与浅拷贝defineCRTSECURENOWARNINGSincludestdio。hincludestdlib。hincludestring。hincludetime。htypedefstructTeacher{charname;intage;}Teacher;结构体中嵌套指针,而且动态分配空间同类型结构体变量赋值结构体成员指针变量指向同一块内存intmain(){Teachert1;t1。name(char)malloc(30);strcpy(t1。name,tom);t1。age22;Teachert2;t2t1;深拷贝,人为增加内容,重新拷贝一下t2。name(char)malloc(30);strcpy(t2。name,t1。name);printf(〔t2〕s,d,t2。name,t2。age);if(t1。name!NULL){free(t1。name);t1。nameNULL;}重复释放浅拷贝:t2的值还指向同一块内存t1。namet1释放后t2又释放导致出现错误if(t2。name!NULL){free(t2。name);t2。nameNULL;}return0;}结构体的对齐方式
结构体的对齐公式:
记住以下这些规则,把结构体往里面套就可以了。结构体对齐的原则就是牺牲空间的方式来减少时间的消耗,空间用完还可以复用,而时间过去了就再也不会回来了。以pragmapack(x)中x的大小和结构中占用空间最大的成员做比较,取小值为n(外对齐依据)以n值和结构体每个成员比较,得到结果列表为m〔x〕根据每个成员的大小依次向内存中填充数据,要求填充成员的起始地址减去构体起始地址的差都可以整除m〔x〕,如不能整除则向后移动,直到可以整除再填充成员到内存(内对齐依据)当全部成员填充完毕后所占用的字节若不能整除n,则扩充内存到可以整除n为止。
举个例子:
在这个例子中structdata的大小为8个字节。