二进制C-结构体对齐
xiusizeof
C语言关键字,用于获取某个类型的大小,如果想获取数组元素个数需要用大小除以单个元素的宽度
int基本类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include "stdafx.h"
int main(int argc, char* argv[]) { int a = 100;
printf("The int para is %d",sizeof(a));
getchar(); return 0;
}
|

整数类型数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include "stdafx.h"
int main(int argc, char* argv[]) { char arr1[10]={0}; short arr2[10]={0}; int arr3[10]={0};
printf("%d\n",sizeof(arr1[0])); printf("%d\n",sizeof(arr2[0])); printf("%d\n",sizeof(arr3[0]));
getchar(); return 0;
}
|

结构体
结构体不同于普通的类型可以直接数,存在结构体对齐
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include "stdafx.h"
struct st1 { char a; int b; char c;
};
struct st2 { int a; char b; char c;
};
int main(int argc, char* argv[]) { printf("%d\n",sizeof(st1)); printf("%d\n",sizeof(st2));
getchar(); return 0;
}
|

结构体对齐
也称为字节对齐,是为了取舍速度和空间,对齐参数有1,2,4,8四种大小,默认为8
1、空间对齐以小为准,比如对齐参数是8的结构体,int类型的数据只需要四个字节即可,不需要补足八个字节,第二个参数
2、空间对齐必须是对齐参数的整数倍,但是如果结构里最长的数据小于对齐参数,就要以最大数的整数倍为准
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include "stdafx.h"
#pragma pack(1) struct st1 { char a; int b; char c;
}; #pragma pack()
int main(int argc, char* argv[]) { printf("%d\n",sizeof(st1));
getchar(); return 0;
}
|

定义结构体的时候建议数据大小从小到大定义
涉及到二级结构体的对齐,以内部结构体属性最长的为准,不是整个结构体的大小为准,数组同理
typedef
C语言关键字,用于为数据类型取一个别名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include "stdafx.h"
typedef struct people { int age; int score; };
int main(int argc, char* argv[]) { people xiu={18,100};
printf("%d\n",xiu.age); printf("%d\n",xiu.score);
getchar(); return 0;
}
|
数组快速赋值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #include "stdafx.h" #include "string.h"
typedef struct people { int x; char name; char arr[10]; };
int main(int argc, char* argv[]) {
people xiu;
xiu.x=18;
xiu.name='a';
strcpy(xiu.arr,"china");
printf("%d %c %s",xiu.x,xiu.name,xiu.arr);
getchar(); return 0;
}
|