C语言中的结构体所占的字节数 ,用sizeof求一个结构体的大小

C语言中用sizeof求结构体所占字节数的详细方法。

一、非嵌套结构体

    struct one{char a; // 1(char所占字节数) + 0(偏移量)short b; // 2(short所占字节数) + 2(偏移量)int c; // 4(int所占字节数) + 4(偏移量)};struct two{char a; // 1 + 0int c; // 4 + 4short b;// 2 + 8};struct three {unsigned int a; // 4 + 0int *p; //  8 + 8char b; // 1 + 16    注意 偏移量16是1的倍数,所以不用改。};printf("%d ,", sizeof (struct one));printf("%d ,", sizeof (struct two));printf("%d ", sizeof (struct three));

运行结果是:8 ,12 ,24
解析:
按理来说第一个应该是 1 + 2 + 4 = 7啊,第二个是 1 + 4 + 2 = 7,第三个是4 + 8 + 1 = 13。跟程序打印的完全不一样,这是应为C语言里面的字节对齐机制。
one结构体的char偏移量是0,第二个short b的偏移量等于它上一个变量的所占字节数加上偏移量即1(1 + 0),但是这个偏移量要是第二个变量b所占字节数的整形倍数,所以第一个偏移量由1变成2,然后第三个变量的偏移量等于第二个变量的所占字节数加上偏移量也就是4(2(short大小) + 2偏移量大小),所以最终的大小为最后一个变量的字节数加上第二个偏移量4,4+4=8,所以结构体one的所占字节数是8。
再来看two,偏移量刚开始是0,第二个变量的偏移量等于第一个变量的偏移量加上类型所占的字节数,也就是1,但是第二个变量是int,占4个字节,偏移量要是4的整数倍,所以由 1 -> 4 偏移量最终是4,第三个是short b,占两个字节,偏移量是 int(4) + 偏移量(4) 就是8,8是2的整数倍,不需要改变,所以就是 2 + 8,10个字节,最终的这个字节数要能够被这个结构体里面的字节数最大的类型整除,two这个结构体最大的是 int 4个字节。所以最终的结果由10变成12。
第三个思路也是一样,结果由17个字节转变成最终的24个字节。
规则就是:

 1. ***第一个变量的偏移量是0。***2. ***第二个变量的偏移量等于前面一个变量的类型所占字节数加上偏移量。***3. ***最终的字节数能够被这里面所占字节数最大的类型整除。***

二、嵌套结构体

    typedef struct{char a;struct{int *p;} kk;char c;}node1;typedef struct{char a;struct{int age;int *p;} kk;int b;}node2;printf("%d ,", sizeof (node1));printf("%d ,", sizeof (node2));

结果为:24 ,40 ,
首先来看第一个node1,结构体里面又嵌套了一个结构体,在这之前我看了网上的很多博客,看的是云里雾里的,简称”不说人话“。经过长达几个小时的折腾,最终找到了一些规律,用很多例子测试发现也是正确的。先由内到外一层一层的找,先找出内嵌结构体占字节数最大的类型,这个里面只有一个int p,占8个字节。然后在来看外面的,将外层的结构体分为两层,内嵌结构体上面的和下面的,将所有类型的字节数之和相加在除以这一整个结构体最大的类型(这里指的是前面提到的 int八个字节)在向上取整乘以最大的字节数,1除以8是零点几,向上取整后是1,在乘8 也就是8。然后是下半部分,只有一个int b,4个字节,4 / 8取整乘8也是8。外层两部分相加之后是16,内层这个结构按照前面的无嵌套结构体算就行了,就是8个字节。最后就是外层加内层 16 + 8 = 24个字节(这个结果也要满足是最大类型所占字节的倍数)。
第二个方式和上面一样。外层是 8 + 8 = 16个字节,内层是20个字节,外层加内层就是36个字节,这个结果不是最大字节数8的倍数,所以最终的结果是40。

END

本文只是个人的一些见解,有问题请在评论区指正!

关于C语言中的结构体所占的字节数 sizeof(struct)相关推荐

  1. C语言中的结构体,结构体中数组初始化与赋值

    最近写c语言中的结构体遇到了些问题,从网上找了些资料如下: 结构体是连续存储的,但由于结构体中成员类型各异,所以会存在内存对齐问题,也就是内存里面会有空档,具体的对齐方式这里 暂不讨论: 1.结构体的 ...

  2. Linux结构体变量报错,C语言中的结构体

    用户自己建立自己的结构体类型 1.  定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...

  3. c语言中定义结构体指针的作用,C语言结构体定义,使用及指针(1)

    前言 C语言中的结构体作为一大难点,并且对于需要学习数据结构的同学来说,这个结构是每次上课都会遇到的,所以,我们只有更深层次的理解结构体的知识,才能更好的掌握数据结构 结构体用处 结构体到底有什么用? ...

  4. C语言中对结构体排序

    在C语言中对结构体排序 用qsort()函数进行排序, qsort()里面要传入4个参数–qsort(数组名,数组长度,sizeof(),排序方法) 实验9-5 查找书籍 (20分) 给定n本书的名称 ...

  5. C语言中的结构体定义和使用例子

    C语言中的结构体定义和使用例子 一.结构体定义的三种方式 结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对 问题事先自行定义,所以结构体类型变量的定义形式就增加了灵活性,共 ...

  6. c语言中什么运算符可以求出数据字节数,C语言的数据类型及其运算符

    一.数据类型 (一).变量与常量 1.变量 (1).定义:其值在其作用域内可以改变的量称为变量.一个变量应该有一个名字,在内存中占据一一定的存储空间.变量在使用前必须要定义,每个变量都有自己的地址.变 ...

  7. 成员变量隐藏c语言,C语言中隐藏结构体的细节

    我们都知道,在C语言中,结构体中的字段都是可以访问的.或者说,在C++ 中,类和结构体的主要区别就是类中成员变量默认为private,而结构体中默认为public.结构体的这一个特性,导致结构体中封装 ...

  8. c语言中的结构体定义和常见用法

    1.结构体简述和概念 结构体是C语言中一种重要的数据类型,该数据类型由一组称为成员(或称为域,或称为元素)的不同数据组成,其中每个成员可以具有不同的类型.结构体通常用来表示类型不同但是又相关的若干数据 ...

  9. step2 . day5 C语言中的结构体和枚举

    最近几天交叉的学习C和Linux,知识梳理的不是很仔细,有很多还没有搞明白的问题,所有耽误了几天更新笔记,也是在细嚼慢咽中,做了一个规划表,现阶段先把C后面的知识学好,然后再梳理Linux系统相关知识 ...

最新文章

  1. Leetcode1963. 使字符串平衡的最小交换次数[C++题解]:贪心
  2. 为什么只读文件系统_xfs 只读共享盘的数据不一致问题
  3. Thrift源码学习二——Server层
  4. html vba 单元格 格式,VBA设置单元格格式之——字体
  5. 【操作系统】竞争条件与临界区
  6. Linux平台下裸设备的绑定:
  7. 高性能计算GPU解决方案系列课程一--高性能计算简介
  8. 李华锦叔叔:追女生该如何正确的花钱?
  9. Javaparser使用
  10. Contacts Journal CRM 1.7 Mac 破解版 Mac上强大的客户关系管理软件
  11. php 仓库出入库管理软件,出入库管理软件_仓库出入库管理软件【免费版】-太平洋下载中心...
  12. 使用SQL管理数据库
  13. 【数据结构基础_有[*pHead]和[*pEnd]的单向链表_(C++实现)】
  14. elementUI设置标签页
  15. php-opencv身份证识别,python opencv实现证件照换底功能
  16. 计算机行业到底还能火多久?
  17. 2022最全windows 上传ipa到苹果方法
  18. DevExpress----破解补丁
  19. 国外卫星地图 Sentinel Hub EO Browser的使用
  20. 牧牛区块链生态,区块链应用于金融领域的优势

热门文章

  1. ubuntu16.04进入登陆界面,但是键盘、鼠标没反应
  2. 推荐几款吾爱上的优秀原创软件~
  3. java计算机毕业设计教学成果管理平台源程序+mysql+系统+lw文档+远程调试
  4. 【mysql】表数据出现问好或者乱码问题
  5. 10万终端设备被入侵,损失惨重!湖北省首例入侵物联网系统案技术解析
  6. Simulink仿真入门到精通(十) S函数
  7. nuc8i3+磐镭x显卡坞在ubuntu16.04下安装2060super驱动以及CUDA环境
  8. 2020我的秋招总结帖 [数据分析岗] | 面经集合
  9. python统计占比
  10. Dialog 使用(详细版)