c语言结构体的对齐方式,C语言结构体内存的对齐知识详解

前言

在前面的章节中,我们谈到了C语言中整数以及浮点数的储存

今天,我们来谈一谈一些关于结构体内存的知识。

我们先来看一个例子:

struct S1

{

char c1;

int i;

char c2;

};

大家来猜猜这个结构体S1的内存是多少?

相信会有人给出 6 的结果,他们或许是这样想的,两个 char 类型分别为一个字节,一个 int 类型又为4个字节,加起来刚好为6个

但是

结果真是如此吗?

我们来看看运行结果:

c语言结构体的对齐方式,C语言结构体内存的对齐知识详解_第1张图片

为什么呢,接下来我们就引出正文。

一.结构体内存对齐规则

首先,正如引例所示,结构体的内存并不是简简单单的将结构体各个成员的大小相加。

结构体的大小往往遵循着结构体的对齐规则:

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

其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

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

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

这里要注意的一点就是要解释一下这个对齐数的概念

对齐数:编译器默认的一个对齐数 与 该结构体变量成员自身大小的较小值。

注:

不是所有的编译器都有自己默认的对齐数。

在VS下其默认的对齐数为8

在linux下的默认值为4

二.怎样计算结构体的大小

在讲计算之前,我们继续来看一看上面的那个例子:

#define _CRT_SECURE_NO_WARNINGS

#include

#include

struct S1

{

char c1;

int i;

char c2;

};

int main()

{

你可能感兴趣的:(c语言结构体的对齐方式)