结构体及其内存对齐详解

一、结构体的简单说明

结构是一些值的集合,这些值称为成员变量。结构的每个 成员可以是不同类型的变量。

1.1结构的声明

其中:tag为结构体的名字,member为该结构体中的成员,variable为结构体tag类型的变量。

 例如:用结构体描述一个学生的基本信息。

struct stu
{
	char name[20]; //名字
	int age;   //年龄
	char sex[5];  //性别
	char id[20];  //学号
};

1.2结构体的自引用

结构体的正确自引用:

struct Node
{
	int data;
	struct Node* next;
};

结构体重定义后的自引用:

typedef struct Node
{
	int data;
	struct Node* next;
}Node;

1.3结构体变量的定义和初始化

有了结构体类型,那么如何定义结构体变量呢,很简单,具体定义如下:

变量定义:

声明类型的同时定义变量p1

struct point
{
	int x;
	int y;
}p1;

单独定义结构体变量

struct point p2;

初始化:

定义变量的同时赋初值

struct Stu        //类型声明
{
 char name[15];//名字
 int age;      //年龄
};
struct Stu s = {"zhangsan", 20};//初始化

结构体嵌套初始化

struct Node
{
 int data;
 struct Point p;
 struct Node* next; 
}n1 = {10, {4,5}, NULL}; 
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化

二、结构体内存对齐

上面我们已经简单介绍了结构体的基本使用,那么如何计算结构体在内存中的存储大小呢?我们继续往下探究。

首先我们举个例子:

#include<stdio.h>
struct S1
{
	char c1;
	int i;
	char c2;
};
struct S2
{
	char c1;
	char c2;
	int i;
};
int main()
{
	printf("%d\n", sizeof(struct S1));
	printf("%d\n", sizeof(struct S2));
	return 0;
}

其中S1,S2成员中有两个char类型,一个int 类型,那么结构体大小应该都是4+1+1=6??

真是这样嘛?让我们来看看程序跑出来的结果。

 为什么会是8和12??而且S1和S2的结构体大小不同?那么这就涉及到结构体内存对齐的知识了。

2.1结构体内存对齐的规则:

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

2.从第二个开始,其他成员变量要对其到(对齐数)的整数倍的地址处

对齐数=编译器默认对齐数与该成员大小较小值

3.结构体总大小为最大对齐数(每个成员都有一个对齐数)的整数倍

4.如果嵌套结构体,嵌套的结构体对齐到自己最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。


2.2内存对齐规则的实例分析

 嵌套情况:

 三、总结

通过这次结构体的学习,对于结构体的基本使用和编写已经熟练了许多,了解到了结构体在内存的对齐规则,怎么去计算结构体的大小。以及知道了结构体在内存的存储规则。对于结构体的实际代码应用还有待提高,后续通过编写有关代码来实际动手操作来对于结构体更加深刻。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值