C语言中结构体内存存储方式

结构体的默认存储方式采用以最大字节元素字节数对其方式进行对齐,例如一个结构体中定义有char、int类型元素,则结构体存储空间按照int类型占用字节,如果还有double类型元素,则结构体存储空间按double类型占用字节对其。针对该特性特意编写如下测试代码:


/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
int i = 0;
printf("struct test...\r\n"); struct _s
{
unsigned char elem;
unsigned int elem1;   /*int 存储空间为4字节*/
}s = {3, 4}; struct _t
{
unsigned char elem;
unsigned int elem2;
double elem1; /*double 存储空间为8字节*/
}t = {8, 9, 9.9}; struct _y
{
unsigned char elem;
double elem1; /*double 存储空间为8字节*/
unsigned int elem2;
}y; printf("int char = %d\r\n", sizeof(int)/sizeof(char));
printf("float char = %d\r\n", sizeof(float)/sizeof(char));
printf("double char = %d\r\n", sizeof(double)/sizeof(char));
printf("struct _y char count = %d\r\n", sizeof(struct _y)/sizeof(char)); /* 默认输出 */
printf("struct _s char count = %d\r\n", sizeof(struct _s)/sizeof(char));
for( i=0; i< sizeof(struct _s)/sizeof(char); ++i)
printf("index %d = %d, ", i, *((unsigned char*)(&s)+i)); printf("struct _t char count = %d\r\n", sizeof(struct _t)/sizeof(char));
for( i=0; i< sizeof(struct _t)/sizeof(char); ++i)
printf("index %d = %d, ", i, *((unsigned char*)(&t)+i)); /* 将struct _s的存储空间所有字节赋值为0 */
for( i=0; i< sizeof(struct _s)/sizeof(char); ++i)
*((unsigned char*)(&s)+i) = 0;
s.elem = 2;
s.elem1 = 5; for( i=0; i< sizeof(struct _t)/sizeof(char); ++i)
*((unsigned char*)(&t)+i) = 0;
t.elem = 8;
t.elem2 = 9.9;
t.elem1 = 6; printf("\r\nstruct _s char count = %d\r\n", sizeof(struct _s)/sizeof(char));
for( i=0; i< sizeof(struct _s)/sizeof(char); ++i)
printf("index %d = %d, ", i, *((unsigned char*)(&s)+i)); printf("\r\nstruct _t char count = %d\r\n", sizeof(struct _t)/sizeof(char));
for( i=0; i< sizeof(struct _t)/sizeof(char); ++i)
printf("index %d = %d, ", i, *((unsigned char*)(&t)+i)); return 0;
}

编译运行上述代码,结构体_s, _t, _y的存储空间分别为8,16,24。对比可知结构体存储空间大小能被结构体空间最大元素占用字节数整除,并且如果相邻元素空间大小累加小于单位最大空间大小,会尝试再次累加,累加如果大于最大空间大小,则选择扩充之前元素的空间大小。

最新文章

  1. python 优矿自动化交易
  2. Hibernate5.2关联关系之双向一对多(三)
  3. java持久层框架mybatis如何防止sql注入
  4. CSS之border-radius
  5. js日期字符串增加天数的函数
  6. Android 学习笔记之Volley(六)实现获取服务器的字符串响应...
  7. 更快、更强——解析Hadoop新一代MapReduce框架Yarn(CSDN)
  8. Android 第三方
  9. 【计算机网络】当输入URL后发生了什么
  10. OSI安全体系结构
  11. Android操作联系人 android开发教程
  12. Golang学习 - bytes 包
  13. Colorbox cannot load the image added by js
  14. C#Windows的HelloWorld
  15. pycharm中的快捷键和简单设置
  16. 15.5 自学Zabbix之路15.5 Zabbix数据库表结构简单解析-其他 表
  17. 依赖注入[8]: .NET Core DI框架[服务消费]
  18. 在Ubuntu 18.04 安装 MySQL 8.0
  19. Android app下载并安装
  20. linux禁止非法用户试探登录

热门文章

  1. jvm GC算法和种类
  2. Dubbo源码解析之SPI(一):扩展类的加载过程
  3. JZOJ 1154. 【GDOI2003】购物
  4. 必备技能五、router路由钩子
  5. 内网渗透之权限维持 - MSF
  6. Simulink仿真入门到精通(三) Simulink信号
  7. C++ 顺序表练习
  8. VsCode从零开始配置一个属于自己的Vue开发环境
  9. Java安装和配置
  10. C语言二进制拼接 (整数和byte类型的字符串拼接)