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<stdio.h>
#include<Windows.h>
struct 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.结构体总大小为最大对齐数的整数倍。

附图解释:



为什么要有内存对齐

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

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

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

猜你喜欢

转载自blog.csdn.net/yc1515707718/article/details/79544822