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。对比可知结构体存储空间大小能被结构体空间最大元素占用字节数整除,并且如果相邻元素空间大小累加小于单位最大空间大小,会尝试再次累加,累加如果大于最大空间大小,则选择扩充之前元素的空间大小。

转载于:https://www.cnblogs.com/BlogsOfLei/p/8666194.html

C语言中结构体内存存储方式相关推荐

  1. 谈谈C语言中结构体内存对齐问题及其offsetof宏的基本使用

    前言 在C语言中,变量在内存中摆放的位置是有一定的规则的,不是想摆放到哪里就摆放到哪里,就比如常见的局部变量在栈区,全局变量在全局区等方式:而今天我们聊的结构体里面的成员变量呀,也是有一定的规则存放在 ...

  2. 【C语言】结构体内存对齐

    前言: 作者简介:爱吃大白菜1132 人生格言:纸上得来终觉浅,绝知此事要躬行   如果文章知识点有错误的地方不吝赐教,和大家一起学习,一起进步!   如果觉得博主文章还不错的话,希望三连支持! 如今 ...

  3. C语言程序设计 | 结构体内存对齐,位段

    在我们学习结构体时,可能会碰到几个难以理解的问题,一个是内存对齐,一个是位段.所以我想分享一下我对这两个问题的理解,来帮助大家更好的学习这两个知识点. 内存对齐 struct {char i;char ...

  4. C语言程序顺序结构1交换变量,如何将c语言中结构体内的所有类型变量的值输出来...

    教了多年<C程序设计>课程,大多学生觉的这门课程难学.其实,按照我们现在的教学大纲和教学要求,只要同学们掌握一些方法,克服心理上畏难.不轻言放弃,是完全可以学好的. <C 程序设计& ...

  5. 关于C语言中的结构体内存对齐与位段问题

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 结构体的内存对齐与位段 一.结构体的内存对齐 1.为什么会有内存对齐? 2.如何内存对齐 3. 如何在设计结构体的时候,既要 ...

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

    前言 在前面的章节中,我们谈到了C语言中整数以及浮点数的储存 今天,我们来谈一谈一些关于结构体内存的知识. 我们先来看一个例子: struct S1 { char c1; int i; char c2 ...

  7. c语言 char转int_图文并茂,一文讲透C语言结构体内存对齐

    ↑点击上方蓝色字体,关注"嵌入式软件实战派"获得更多精品干货. (以下有约5000字内容,建议收藏再读,推荐下载源码自行测试以加深理解.) 面试官:你知道C语言的结构体对齐吗? 应 ...

  8. C语言结构体内存布局问题

    引言 C语言结构体内存布局是一个老生常谈的问题,网上也看了一些资料,有些说的比较模糊,有些是错误的.本人借鉴了前人的文章,经过实践,总结了一些规则,如有错误,希望指正,不胜感激. 实际环境 系统环境 ...

  9. 【C语言】自定义类型——计算结构体内存对齐

    文章目录 前言 一.结构体 结构体类型的声明 结构的自引用 结构体变量的定义和初始化 *结构体内存对齐 修改默认对齐数 结构体传参 结构体实现位段(位段的填充&可移植性) 二.枚举 枚举类型的 ...

最新文章

  1. 使用Python将PDF转成文档
  2. 使用flink Table Sql api来构建批量和流式应用(3)Flink Sql 使用
  3. 心态决定你的人生高度
  4. 用户体验分析: 以 “南通市图书馆微信公众号” 为例
  5. python引用numpy出错_使用numpy时出错
  6. fir c语言程序,fir.rar fir的c语言程序 - 下载 - 搜珍网
  7. 10月21日下午PHP常用函数
  8. 信息泄露案件_圆通回应运单信息泄露案件:系主动报案,涉4万余条敏感信息...
  9. harbor1.4.0高可用部署
  10. 【计算机三级数据库技术】三级数据库技术应用题集锦
  11. 怎样杀计算机病毒,如何彻底查杀计算机病毒
  12. Excel直接将选区转为图片,并另存为文件的操作
  13. 当新华社遇上华为云 权威新闻全球传播再添“神器”
  14. python tkinter canvas
  15. 黄灯:一个农村儿媳眼中的乡村图景
  16. 互联网史话----十亿美金之51
  17. CSS实现炫酷动画背景
  18. 12-Gateway新一代网关
  19. 自然语言处理NLP中文分词,词性标注,关键词提取和文本摘要
  20. 按键精灵9.5.1.11790秒速启动,多余元素全灭版

热门文章

  1. Java并发编程之ConcurrentHashMap原理解析
  2. 贝叶斯信念网络和马尔科夫链有什么区别
  3. Bitmap详解(上)常用概念和常用API
  4. 设计模式之--单例模式
  5. 源码角度解释fragment的坑(二)
  6. oracle12c 新增维护时间窗口,ORACLE 12C新特性-自动维护全局索引 | 信春哥,系统稳,闭眼上线不回滚!...
  7. alphac测试和bata测试区别_绝缘电阻测试仪和接地电阻测试仪的测试方式区别
  8. 1.1.0-简介-P12-分布式锁的解决方案(二)
  9. 95-40-025-java.util.concurrent-并发容器
  10. 95-10-110-启动-AdminManager