C-结构体对齐

sizeof

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;

}

image-20231108095435608

整数类型数组

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;

}

image-20231108140651381

结构体

结构体不同于普通的类型可以直接数,存在结构体对齐

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;

}

image-20231108140726878

结构体对齐

也称为字节对齐,是为了取舍速度和空间,对齐参数有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;

}

image-20231108142622405

定义结构体的时候建议数据大小从小到大定义

涉及到二级结构体的对齐,以内部结构体属性最长的为准,不是整个结构体的大小为准,数组同理

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;

}