首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

计算结构的大小

计算结构的大小      C代码中定义的结构是一块连续内存,各成员按照定义的顺序依次在其中存放。编译器在完成语法分析后,需要计算它的大小,然后才能正确地为结构分配空间。...所有补齐字节计入结构的大小。      请写一个程序来计算结构的大小,要考虑字节对齐,同时要支持结构多层嵌套的情况。 结构大小的计算 成员在结构体内的偏移必须是它的字节对齐值的倍数。...3)结构的字节对齐值等于它的所有成员的字节对齐值的最大值。 2 大小的计算:    1)基本类型char、short、int、double的大小依次为1、2、4、8字节。   ...:无 * 返回:正常返回0,失败返回-1 */ int end_nested_struct(void); /* 功能:完成结构定义,计算它的大小 * 输入:无 * 输出:size:结构大小...,计算它的大小 * 输入:无 * 输出:size:结构大小 * 返回:正常返回0,失败返回-1 */ int finish_struct(unsigned int *size) { if

1.5K100

结构大小的计算

原 则 1) 结构变量的首地址能够被其最宽基本类型成员的大小所整除; 2) 结构每个成员相对于结构首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal...adding); 3) 结构的总大小为结构最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding) 其实暂且不管这三原则,只要记住第三个,就是结构大小结果要为成员中最大字节的整数倍...先看下面定义的两个结构: ? 分别用程序测试得出:sizeof(S1)=6 , sizeof(S2)=4 【问】仅仅改变了结构成员的顺序,结果不一样?...所以对于 S1 结构大小为 2*3=6,至于为什么第二个 char,多的那个字节不丢到,就是遵循第三个原则,就是结构大小结果要为成员中最大字节的整数倍。 ?...再看一个:就是当结构成员变量是另外一个结构时,只要把结构中成员为另一结构作为整体相加就行。 ?

67810
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    sizeof(结构)的计算

    摘要: 经常被计算结构的sizeof给搞晕,于是找了个时间,静下心来,搞定它。 一、为什么结构计算这么乱?...结构变量的首地址能够被其最宽基本类型成员的大小所整除; 2. 结构每个成员相对于结构首地址的偏移量都是当前成员大小的整数倍,如有需要编译器会在成员之间加上填充字节; 3....、short、int、float、double这样的内置数据类型;         3、我认为计算结构大小的时候,主要用到准则2和准则3,对于准则1是编译器自动完成的,不需要过多理会。        ...4、C++中类的可以看做是特殊的结构,所以类的sizeof的计算结构是一样的。 三、下面拿具体的程序来详细说明: 1 // sizeof(结构).cpp : 定义控制台应用程序的入口点。...2了,所以编译器开始在char的后面填充3个字节,使得成员A相对于所在结构B的地址偏移量是4,来满足准则2,这时加上B的长度8,B中最后一个成员char相对于B来说地址偏移量是8,能满足准则2,所以不需要在

    1K90

    C语言如何计算结构大小(结构的内存对齐)

    前言: 结构的内存对齐是有关结构体内容的很重要一个知识点,主要考察方式是计算结构的字节大小。...引言: 当我们对计算结构一无所知,我们不妨自己思索如何计算,是不是直接计算结构成员变量占用内存的大小呢?...一、计算偏移量 我们要研究明白结构的成员列表在内存中到底是如何存储的,首先要知道结构的各个成员变量在内存中相较于起始位置的偏移量。...这时候要引用到offsetof,这个宏可以计算结构成员相较于结构起始位置的偏移量。 使用宏offsetof  如何使用宏offsetof?...结构到底如何计算? 二、结构的对齐规则 我们经过上面的分析,发现结构成员不是按照顺序在内存中连续存放的,而是有一定的对齐规则,接下来我们就研究结构的内存规则。

    10610

    【C 语言】结构 ( 结构偏移量计算 | 代码示例 )

    文章目录 一、结构成员偏移量 二、完整代码示例 一、结构成员偏移量 ---- 获取 Student 结构中 age 成员偏移量 有 2 种写法 ; 结构样式 : typedef struct...进行解析 , 可以求出结构某个 成员 相对于 0 的偏移量 ; int offset = (int)&(((Student *)0)->age) 先获取 结构 成员 , 然后再取该成员的地址 ;...成员的 偏移量 是可以直接 计算获取的 , 不管有没有实际的 结构变量 ; 结构变量 如果声明完成 , 那么结构中的 成员 的内存 , 就已经分配好了 ; 如果知道了 结构成员 的内存地址 ,...可以根据该 结构成员 的偏移量 , 计算出该结构的 首地址 ; 二、完整代码示例 ---- 完整代码示例 : #include #include #include... /** * @brief The Student struct * 定义 结构 数据类型 , 同时为该结构类型声明 别名 * 可以直接使用 别名 结构变量名 声明结构类型变量

    1.8K30

    【C语言】结构的大小是如何计算的?(结构对齐)

    一.使用sizeof计算结构的大小 通常情况下,我们习惯于使用sizeof运算符来计算结构的大小。...接着我们在主函数内部创建一个结构变量s。这时我们就可以使用sizeof运算符来计算这个结构的大小了。...sizeof中来计算结构类型的大小: 可以看到,这个结构的大小是32个字节。...三.利用结构对齐规律计算结构大小 1.结构的对齐规则: 要知道结构大小是如何计算的,首先需要了解结构的对齐规则: 1、第一个成员在于结构变量偏移量为0的地址处。...12,而它的计算过程如下: 理解了这个结构的大小是如何计算的,我们再来看看调整顺序后它为何又变成8了: struct stu { char ch1; char ch2; int i; }; 理解了这两个结构的内存大小是如何计算得出的

    84210

    c语言struct结构大小计算

    直入主题,要判断一个结构所占的空间大小,大体来说分三步走: 1.先确定实际对齐单位,其由以下三个因素决定     1> CPU周期     WIN  vs  qt  默认8字节对齐     Linux...(取两者中小的那个) 3.结构的整体大小必须为实际对齐单位的整数倍。...上面三步即是万能公式,下面看实际例子(linux 64系统下): 1. nums中,没有手动设置对齐单位,linux64系统的默认对齐单位是8字节,结构nums的最大成员double d占8个字节,故实际对齐字节是二者最小...”,所以29+5(浪费空间)=32,所以最后nums的空间情况是1(a)+1(浪费空间)+2(b)+4(c)+8(d)+13(arr)+5(浪费空间)=32字节 另外结构嵌套结构的字节对齐和上面原理一样...,唯一要注意的是子结构的起始地址与母结构的起地址之间的距离必须是子结构最大成员或者实际对齐单位(还是取两者小的那个)的整数倍。

    1.4K41

    Linux并发(task_struct结构

    Linux下的进程也好,线程也罢,在内核中统统都以任务(task)的面目示人,他们用一样的内核数据结构来表示。...拓展: 内核中用一个非常大的结构来表达进程或者线程(统称任务task),下面是这个结构的掠影: ?...如果没什么意外,这个结构可能是这个宇宙中最大的单个变量了,一个结构就有好几k那么大,想想他包含了一个进程的所有信息,这么庞大也不足为怪了。...LINUX内核代码纷繁复杂,千头万绪,这个结构是系统进程在执行过程中所有涉及的方方面面的缩影,包括系统内存管理子系统、进程调度子系统、虚拟文件系统等等,以这个所谓的PCB为切入点,是一个很好的研究内核的窗口...总之,当一个程序文件被执行的时候,内核将会产生这么一个结构,来承载所有该活动实体日后运行时所需要的所有资源,随着进程的运行,各种资源被分配和释放,是一个动态的过程。

    1.3K20

    结构

    • •3.为此,C语言专门提供了一种构造类型来解决上述问题,这就是结构,它允许内部的元素是不同类型的。 二、结构的定义 •1.定义形式:结构体内部的元素,也就是组成成分,我们一般称为"成员"。...•1.先定义结构类型,再定义变量。...输出结果为: 结构数组 1.定义 •跟结构变量一样,结构数组也有3种定义方式 struct Student {     char *name;     int age; }; struct Student...,跟普通数组的用法是一样的 结构作为函数参数 •将结构变量作为函数参数进行传递时,其实传递的是全部成员的值,也就是将实参中成员的值一一赋值给对应的形参成员。...•每个结构变量都有自己的存储空间和地址,因此指针也可以指向结构变量 •* 结构指针变量的定义形式:struct 结构名称 *指针变量名 •* 有了指向结构的指针,那么就有3种访问结构成员的方式

    1.6K130

    linux时间相关结构和函数整理

    一般通过 time_t time = time(NULL); 获取. (2) struct timeb结构: 主要有两个成员, 一个是秒, 另一个是毫秒, 精确度为毫秒. 1 struct timeb...microseconds */ 5 }; 由int gettimeofday(struct timeval *tv, struct timezone *tz);获取. struct timezone结构的定义为...获取特定时钟的时间,时间通过tp结构传回,目前定义了6种时钟,分别是 CLOCK_REALTIME                                         系统当前时间,从1970...而实际实现中,linux上的nanosleep和alarm相同,都是基于内核时钟机制实现,受linux内核时钟实现的影响,并不能达到纳秒级的精 度,man nanosleep也可以看到这个说明,man里给出的精度是...:Linux/i386上是10 ms ,Linux/Alpha上是1ms

    2.9K50

    结构

    (如 int ) 函数参数是什么类型就传什么类型 /* 函数功能:定义一个结构,在另一个函数中打印结构成员的值; 函数形参为结构变量的函数使用void qq(struct book cc); */...);   //因为函数在主函数下面所以要声明一下函数 void main() { struct book one;       //定义一个结构名为book的结构变量one one.cose=25;... -即struct book cc和struct book one;  问一个问题如何把一个结构的变量的成员的信息copy到另一个结构变量?... one;       //定义一个结构名为book的结构变量one struct book cc;        //定义一个结构名为book的结构变量cc one.cose=25;  one.name...struct book shu[20];    //20本书  /* 函数功能:结构变量为数组的结构 */ /* 函数功能:结构变量为数组的结构 */ #include"stdio.h" struct

    1.4K60

    结构

    结构 1.1 结构基本概念 结构属于用户 自定义的数据类型, 允许用户存储不同的数据类型 1.2 结构定义和使用(cpp23.cpp) 语法:struct 结构名{结构成员列表}; 通过结构创建变量的方式有三种...: struct 结构名 变量名 struct 结构名 变量名 = {成员1值,成员2值,...}...std; //定义结构,定义结构时 struct 关键字 不能省略 struct Student { //以下是 结构属性 //姓名 string name;...作用:将自定义的结构放入到数组中方便维护 语法:struct 结构名 数组名[元素个数] = {结构1,结构2,...}; 使用 结构数组 时,struct 关键字可以省略 #define...(cpp25.cpp) 作用:结构中的成员可以是另一个结构 例如:每个老师辅导一个学员,一个老师的结构中,记录一个学生的结构; 1.6 结构做函数参数(cpp33.cpp) 作用:将结构作为参数向函数中传递

    17300

    结构

    结构 结构的作用 数组:具有相同类型的数据的集合 结构:存储不同类型的数据项 单一的数据类型无法满足特定的需求,数据类型的集合体:结构 出现了 结构的定义和使用 结构的定义方式 结构是一种自定义数据类型...,"小明同学"}; // STU这个结构类型就可以直接定义使用了 定义结构的时候给结构取别名 1//例3: 推荐这种写法 2typedef struct stu //定义结构的时候取别名...如果嵌套了结构的情况,嵌套的结构对齐到自己最大对齐数的整数倍处,结构的整体大小就是所有最大对齐数(含嵌套结构的对齐数)的整数倍。...4 int b:4; //成员 b 被:后面的数字限制 占用 4 位的内存 5}; 注意: 一个 字节 是 8 位 位域的取值范围不能超过它所依附的数据类型的长度 1例4: 2struct...Stu 3{ 4 int b:33; // int 4 个字节,32位;33超过了int的数据长度,报错 5}; 例4中sizeof(Stu)=4;原因还是内存对齐 枚举 关键字:enum 枚举类型的定义

    1.4K30

    结构

    emp8 取得就是结构的值 Go 语言允许我们在访问 firstName 字段时,可以使用 emp8.firstName 来代替显式的解引用 (emp8).firstName。...如果结构名称以大写字母开头,则它是其他包可以访问的导出类型(Exported Type)。...同样,如果结构里的字段首字母大写,它也能被其他包访问到 结构名称首字母和字段大小写,对同一个包的读写不受任何影响,如果不在同一个包,就有严格的显示,大写能方位,小写不能方位 12.结构相等性 结构是值类型...如果它的每一个字段都是可比较的,则该结构也是可比较的。如果两个结构变量的对应字段相等,则这两个变量也是相等的。...package employee // 创建一个私有的结构 type employee struct { name string age int } // 返回结构类型 func

    1.2K20
    领券