1 关于可变参数中的va_start(ap,v), va_arg(ap,t), va_end(ap)三个函数解析。
va_start(ap,v)等价于 char *p = (char *)&format; i=va_arg(ap,int)等价于i = *((int *)p),p = p + sizeof(int).分两个步骤完成取值,指针移动。va_end(ap)等价于p = (char *)0 .
2 关于结构体对齐的三个原则。 (在没有#pragma pack宏的情况下)
原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
•原则2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)
•原则3、收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要齐。
struct person{ 30 char *name; 31 int age; 32 char score; 33 int id; 34 }; 35 36 struct person1{ 37 char *name; 38 int age; 39 char score; 40 int id; 41 }__attribute__ ((packed)); //告诉GCC编译器 不对结构体数据进行对齐处理 42 43 struct person2{ 44 char *name; 45 int age; 46 char score; 47 int id; 48 }__attribute((aligned (4))); //告诉编译器,进行4字节对齐处理 49 50 struct person4{ char *name; 52 struct person per; 53 int age; 54 char score; 55 int id; 56 57 }; 58 int main(int argc,char **argv) 59 { 60 struct person per={"www.100ask.org",10,'A',123}; 61 printf("sizeof(char )=%d\n",sizeof(char )); 62 printf("sizeof(int )=%d\n",sizeof(int )); 63 printf("sizeof(char *)=%d\n",sizeof(char *)); 64 printf("sizeof(char **)=%d\n",sizeof(char **)); 65 printf("sizeof(struct person)=%d\n",sizeof(struct person)); 66 printf("sizeof(struct person1)=%d\n",sizeof(struct person1)); 67 printf("sizeof(struct person2)=%d\n",sizeof(struct person2)); 68 printf("sizeof(struct person4)=%d\n",sizeof(struct person4)); 69 70 printf("&per.name =%p,per.name =%s\n",&per.name ,per.name); 71 printf("&per.age =%p,per.age =%d\n",&per.age ,per.age); 72 printf("&per.score =%p,per.score =%d\n",&per.score,per.score); 73 printf("&per.id =%p,per.id =%d\n",&per.id ,per.id); 74 return 0; 75 } 76
输出结果为:
main.c push_test push_test.c struct_test struct_test.c [email protected]:~/myFile/put_test$ ./struct_test sizeof(char )=1 sizeof(int )=4 sizeof(char *)=8 sizeof(char **)=8 sizeof(struct person)=24 sizeof(struct person1)=17 sizeof(struct person2)=24 sizeof(struct person4)=48 &per.name =0x7ffde2520550,per.name =www.100ask.org &per.age =0x7ffde2520558,per.age =10 &per.score =0x7ffde252055c,per.score =65 &per.id =0x7ffde2520560,per.id =123