C语言结构体占用内存深入讲解

 更新时间:2020年12月04日 14:58:39   作者:Y_peak  
这篇文章主要给大家介绍了关于C语言结构体占用内存的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

前几天有个小朋友问了我一下,关于C语言结构体占用空间的问题。觉得以后会对小可爱有点帮助,就打算先写一下。

struct Test
{
 int a;
 char b;
 int c;
} test;

理论上,结构体中的各个成员在内存中应该是连续储存的,就像数组里面的元素一样。事实上,也确实是这个样子的,不过和我们想象的有点不一样。

按照我们最初的想法,变量test所占的内存为 4 + 1 + 4 = 9。

但是我们写一个小代码验证一下发现和我们想的不一样。

它的内存为12。因为 int类型是4个字节,所以是不是各个成员的内存都是按照最大的那个设置呢?毕竟 4 * 3 = 12,我们再次实验,

如果按照我们的推测,那么内存大小应该是 8 * 3 = 24。为何是16呢?

下面我来总结一下。

总结

C语言结构体所占内存大小,其实里面涉及到C语言内存对齐,提高寻址效率的一种思想在里面。具体我就不在这里展开来说了,有兴趣的可以自己百度了解一下。

其实小可爱最想了解的应该是如何计算,结构体的内存大小。

不包含,数组和指针的结构体

对于不包含,数组和指针的结构体,知道各个成员所占内存大小后,可以直接相加,不过相加的时候必须保证前面的成员变量的内存所占内存必须是下一个成员变量所占内存的整倍数,如果不够就补上;并且最后的结果必须要是所占内存空间最大的成员变量的整倍数

下面我来几个例子说明:

struct Test
{
 double c; 	//8
 int a;		//4
 char b;		//1
} test;

所占内存大小,8 + 4 + 1 = 13,最大内存为8, 所以应该这样计算 8 + 4 + 4 = 16。
下面我们交换下,

struct Test
{
 int a;		//4
 double c; 	//8
 char b;		//1
} test;

所占内存大小, 4 + 8 + 1 = 13,因为double类型是8个字节,而前面只有4个字节,并且成员变量最大内存为8,所以应该这样计算 8 + 8 + 8 = 24。

struct Test
{
 int a;		//4
 char b;		//1
 double c; 	//8
} test;

同理4 + 1 + 8 = 13,应该变为 4 + 4 + 8 = 16。

包含,数组和指针的结构体 包含指针的结构体

对于包含指针的结构体,可以用和上面相同的方法进行计算,一般指针的大小都是固定的4个字节(在我的电脑上,你们可能不同),因为不管什么类型的指针只需要储存地址,不需要储存地址指向空间的内容。

struct Test
{
 char a;		//1
 char *b;	//4
 double c;	//8
} test;
struct Test
{
 char a;		//1
 int *b;	//4
 double c;	//8
} test;
struct Test
{
 char a;		//1
 double *b;	//4
 double c;	//8
} test;

这三种所占内存大小均为 4 + 4 + 8 = 16。如果将变量 b 和变量 c 的位置互换,则变为 8 + 8 + 8 = 24。 包含数组的结构体

数组中的元素地址是连续的,所以一个数组所占空间大小,为数组类型 * 元素个数。

知道了数组所占空间大小后,再来说说如何计算结构体中包含数组的情况,在之前计算的时候,我说过相加的时候必须保证前面的成员变量的内存所占内存必须是下一个成员变量所占内存的整倍数,但是如果下一变量为数组,则没有这个要求。

例如:

struct Test
{
 int a;
 char b[21];
 int d;
 double c;
} test;

应该为 4 + 24 + 4 + 8 = 40。

struct Test
{
 int a;
 char b[19];
 int d;
 double c;
} test;

应该为 4 + 20 + 8 + 8 = 40。

struct Test
{
 char a;		//1
 char b[19];	//19
 int d;		//4
 double c;	//8
} test;

应该为 1 + 19 + 4 + 8 = 32。

struct Test
{
 char a;		//1
 char b[17];	//17
 int d;		//4
 double c;	//8
} test;

应该为 1 + 19 + 4 + 8 = 32。

struct Test
{
 char a;		//1
 char b[15];	//15
 int d;		//4
 double c;	//8
} test;

应该为 1 + 15 + 8 + 8 = 32。

到此这篇关于C语言结构体占用内存的文章就介绍到这了,更多相关C语言结构体占用内存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现数独小游戏

    C语言实现数独小游戏

    这篇文章主要为大家详细介绍了C语言实现数独小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++设计模式之模板方法模式(TemplateMethod)

    C++设计模式之模板方法模式(TemplateMethod)

    这篇文章主要为大家详细介绍了C++设计模式之模板方法模式TemplateMethod,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • C++利用数组(一维/二维)处理批量数据的方法

    C++利用数组(一维/二维)处理批量数据的方法

    对于简单的问题,使用简单的数据类型就可以了,但是对于有些需要处理的数据,只用以上简单的数据类型是不够的,难以反映出数据的特点,也难以有效的进行处理,本文小编给大家介绍了C++利用数组(一维/二维)处理批量数据的方法,需要的朋友可以参考下
    2023-10-10
  • C语言中的运算符和结合性问题

    C语言中的运算符和结合性问题

    这篇文章主要介绍了C语言中的运算符和结合性问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Python扩展C/C++库的方法(C转换为Python)

    Python扩展C/C++库的方法(C转换为Python)

    这篇文章主要介绍了Python扩展C/C++库的方法(C转换为Python),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • C++调用Matlab函数求特征值

    C++调用Matlab函数求特征值

    这篇文章主要为大家详细介绍了C++调用Matlab函数求特征值,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • MFC中exe图标修改的方法

    MFC中exe图标修改的方法

    修改窗口标题图标可通过导入图标,然后在CMainFrame.:OnCreate函数中加载图标即可, 代码如下:
    2013-04-04
  • C语言链表完整操作演示

    C语言链表完整操作演示

    这篇文章主要为大家详细介绍了C语言链表的完整操作演示,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • C++中std::generate函数的具体使用

    C++中std::generate函数的具体使用

    std::generate是C++标准库中的一个算法,用于生成一个值的序列并赋值给一个迭代器范围内的元素,本文就来介绍一下std::generate函数的具体使用,感兴趣的可以了解一下
    2025-02-02
  • C++实现关机功能详细代码

    C++实现关机功能详细代码

    大家好,本篇文章主要讲的是C++实现关机功能详细代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01

最新评论