C语言结构体在内存中的存储情况探究------内存对齐
条件(先看一下各个基本类型都占几个字节):
void size_(){
printf("char类型:%d\n", sizeof(char));
printf("int类型:%d\n", sizeof(int));
printf("float类型:%d\n", sizeof(float));
printf("double类型:%d\n", sizeof(double));
return;
}
结果:

先来一下, 这个结构体在内存中占有多少个字节的内存呢?
typedef struct mystruct{ /*结构1*/
int i_int;
char c_char;
char s_char[];
}MYSTRUCT;
这个呢(交换数据成员顺序)?
typedef struct mystruct{ /*结构体2*/
char c_char;
int i_int;
char s_char[];
}MYSTRUCT;
现在让它自己告诉我们
int main()
{
MYSTRUCT my_st = {};
int size_struct = sizeof(my_st);
printf("%d\n", (int)&my_st.i_int);
printf("%d\n", (int)&my_st.c_char);
printf("%d\n", (int)my_st.s_char);
printf("占用内存大小:%d 个字节\n", size_struct); return ;
}
首先看结构体1的结果

可以看出:int占有4个字节, char占有了1个字节, 那么后面char类型的数组占有了11个字节
这是什么鬼?明明定义了char数组长度为9为什么会是11
别着急继续向下看
查看结构体2的结果(难道不是16?)

哈哈, 竟然又出来个20
揭晓答案:
这是因为结构体的存储存在内存对齐机制,也就是 < 结构体大小能被最宽基本类型成员大小所整除 >
基本类型指的是 char int double 等,这样的对齐机制使得寻址更加方便
为什么结构体1占有16个字节:
因为单个char成员会与其下面的char类型数组组合在一起 也就是相当于一个char类型的长度为10的数组
其中最宽基本类型为 int 占4个字节 而后面的 ”char[10]“数组要满足是int占有4个字节的整数倍最小的就是12, 所以共16个字节
为什么结构体2占有20个字节:
第一个成员为char单个字符, 其后面是一个int类型,不能结合故要给char分配4个字节
后面的char数组当然还要分配12个字节, 所以4+4+12=20个字节
了解了对齐机制后再来分析一个
typedef struct mystruct{ /*结构体3*/
char c_char;
double d_double;
int i_int;
char s_char[];
}MYSTRUCT;
分析:
最宽基本类型是 double 占有8个字节----------------------------------------------------------------8
第一个char占有1个, 但是要补齐为8个字节---------------------------------------------------------8
后面的int占有4个,相当于4个char类型,与char数组结合为 ”char[4+9]“ , 要补齐为16个字节----16
得到结果-------------------------------------------------------------------------------------------32
验证一下

果然就是这样
本节完......
C语言结构体在内存中的存储情况探究------内存对齐的更多相关文章
- String在内存中如何存储(Java)
JDK1.8中JVM把String常量池移入了堆中,同时取消了“永久代”,改用元空间代替(Metaspace)java中对String对象特殊对待,所以在heap区域分成了两块,一块是字符串常量池(S ...
- Java变量在内存中的存储
目录 Java变量在内存中的存储 成员变量 局部变量 总结 Java变量在内存中的存储 以下探究成员变量和局部变量在内存中的存储情况. package com.my.pac04; /** * @aut ...
- 解析C语言结构体对齐(内存对齐问题)
C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...
- C语言 结构体的内存对齐问题与位域
http://blog.csdn.net/xing_hao/article/details/6678048 一.内存对齐 许多计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地 ...
- C语言结构体的内存对齐问题
在C语言开发当中会遇到这样的情况: #include <stdio.h> struct test { int a; char b; }; int main(int argc, const ...
- 逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式
逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式 一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不 ...
- C语言结构体及其内存布局
code[class*="language-"], pre[class*="language-"] { color: rgba(51, 51, 51, 1); ...
- 在C语言结构体中添加成员函数
我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...
- C语言-结构体struct-联合体union-枚举enum
结构体 在Java中,我们要表示一个复合的数据类型就会使用对象去封装.而C就有结构体. 结构体是C语言中自定义的数据类型,是一组变量的集合,有别于数组,数组仅限于同一种数据类型,而结构体可以是任何数据 ...
随机推荐
- 部署kube-prometheus,添加邮件报警
这个项目出自coreos,已经存在很久了,第一次尝试的时候还很简陋,现在完善了很多. 项目提供了一键部署脚本,跑起来并不难,不过个人感觉要真正掌握并灵活使用并不是很容易. kube version: ...
- UiAutomator2.0入门
总是听说UiAutomator这个框架,但从来没有使用过.找了篇入门,实践一下.实践之后感觉,uiautomator写测试代码,还是有点费劲.接口名比较多,比较长.网易的atx里使用的uiautoma ...
- CAP定理为什么只能同时满足两个
Consistency(一致性), 数据一致更新,所有数据变动都是同步的 Availability(可用性), 好的响应性能 Partition tolerance(分区容忍性) 可靠性 在网上看了很 ...
- python的类的 静态属性 类方法 静态方法
一.静态属性 静态属性说的就是数据属性 1.定义一个房间的类,求下这个房间的面积 class Room: def __init__(self,name,ower,width,length,heigh) ...
- OpenStack 图形化服务 Horizon使用(十三)
构建一台云主机 上图中Count可以选择同时创建多台 最终“启动实例” 创建成功后,可以进入控制台,操作新建云主机
- MySQL的DML常用语法格式
MySQL的DML常用语法格式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们知道MySQL的查询大致分为单表查询,多表查询以及联合查询.多表查询,顾名思义,就是查询的结果可能 ...
- 解决pdf打印预览中遇到特殊字符,导出失败问题
本博客是自己在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处. 由于近日由于pdf中存在特殊字符导致导出失败,主要原因是"&"字符与freema ...
- Spark记录-spark与storm比对与选型(转载)
大数据实时处理平台市场上产品众多,本文着重讨论spark与storm的比对,最后结合适用场景进行选型. 一.spark与storm的比较 比较点 Storm Spark Streaming 实时计算模 ...
- 【DS】排序算法之插入排序(Insertion Sort)
一.算法思想 一般来说,插入排序都采用in-place在数组上实现.具体算法描述如下:1)从第一个元素开始,该元素可以认为已经被排序2)取出下一个元素,在已经排序的元素序列中从后向前扫描3)如果该元素 ...
- pandas重置索引的几种方法探究
pandas重置索引的几种方法探究 reset_index() reindex() set_index() 函数名字看起来非常有趣吧! 不仅如此. 需要探究. http://nbviewer.jupy ...