c语言自定义64字节,C语言自定义类型——结构体

我们知道C语言中的数据类型有基本类型,自定义类型,指针类型,今天我们重点说说自定义类型中的结构体。

为什么要有结构体?

我们在平时可能会定义一些相同的数据类型,比如 int,  float,但我们在统计一个表的数据时,就显得捉襟见肘了,比如一个学生成绩表, 里面有不同的数据类型,所以就需要结构体了。

结构体的定义和初始化

struct stu{

char name[]; //姓名

int num; //学号

int age; //年龄

}sut1={"张三",20,18}; //其中struct stu就是一个自定义类型,就相当与int一样,这段代码的意思是定义并初始化了这样的结构体stu1

结构体的成员可以是数组,指针,甚至是结构体。

结构体中的内存对齐

首先看一下下面这个代码

#define _CRT_SECURE_NO_WARNINGS 1

#include#includestruct S1

{

char c1;

int i;

char c2;

};

int main()

{

printf("%d\n", sizeof(struct S1));//结果为12

system("pause");

return 0;

}

这个结果是不是和你想的不一样,这就要牵扯到结构体中的内存对齐问题了。

操作系统在访问内存时,并不是从任意字节开始访问,而是按照一定的规则从编址的某个字节读取一定的长度,内存必须按照这样的规则对齐。

规则:

1.结构体的第一个成员在偏移量为0的地址处。

2.其他成员对齐到 对齐数整数倍地址处,对齐数= 编译器默认的一个对齐数 与 该成员大小的较小值。

VS中默认的值为8, linux中的默认值为4。

3.结构体总大小为最大对齐数的整数倍。

附图解释:

c语言自定义64字节,C语言自定义类型——结构体_第1张图片

为什么要有内存对齐

1.不是所有平台都能访问任意字节的地址,一些平台只能从特定长度开始访问。

2.提高访问效率,如果要访问为对齐的内存,就要在两个字节访问两次,然后拼接数据,这样效率极低。

如果内存对齐后,只需要一次访问,明显效率更快。

你可能感兴趣的:(c语言自定义64字节)