C语言计算结构体长度问题
结构TT;{ int n1char n2浮动n3;//因为4个字节对齐 , 这里是12个字节的union uu//这里是一个union , 所以里面的内容是最大的 , 作为它的大小 , 所以用int u1[2] , 占8个字节{ Int U1[2];char U2[2];}苏;};最后的结果 , 应该是12 ^ 8=2011 , 绝对不正确 。值得注意的是 , 有些编译器可以设置对齐方式 , 这会影响结构的大小 。
C语言中的结构体的大小如何计算
库sizeof();是参数结构的变量 。自己算的话 , 就是每个结构成员的大小之和 , 在不同的编译器下是不一样的 , 所以用sizeof()比较好 。有些int编译器是2字节 , 有些是4字节 。你的例子是2字节浮点4字节char1字节 。
结构体类型的长度计算
你可以& # 039;不要像楼主那样解释 , 计算一下结构的长度 , 就可以& # 039;t忽略一个参数:# pragma pack(8);//这个8是结构的默认对齐参数 。它的作用是:1 。当结构中变量类型的长度大于此时 , 结构的对齐参数为8;2如果一个结构中成员的类型都小于这个默认值 , 那么该结构的对齐参数就是在该结构中占用空间最长的成员变量的长度 , 比如instruct A { char a1char a2 };的对齐长度为1(字符变量占1个字节) 。据楼主& # 039;输出 , 楼主& # 039;s运行环境包(4) , 由于A中double的字符大于4 , 结构A的对齐参数为4 , 所以结果为4 ^ 4 ^ 4 。其实 , 最后两个4 & # 039;s存储双精度数据;第二个问题int a;已经等于4 , 所以对齐变量是4 。当你知道对齐规则后 , 内存是如何排列的?定义变量的时候 , 先找一个内存地址 。根据计算机的内部结构(I & # 039m还不确定) , 将选择剩余对齐变量为0的可用地址作为存储该结构的地址 。比如问题2的对齐变量既然是4 , 你肯定会选择一个4的整数倍的地址作为存储这个结构的起始地址 , 然后10个char类型 , 占10个字节 。这时 , 下面的地址可以& # 039;不能被4整除 , 例如 , 8 ^ 10=18可以& # 039;t不能被4整除 , 所以会空2个字节 。从20开始 , 你将存储int , 正好是4个字节 。地址变成了24 , 可以被4整除 。即char s[10]和int a占用12(有2个空字节)4=16个字节 。由于int a之后的地址能被4整除 , 所以A K的长度是A是12 , 所以B是28 。可以# pragma pack(8);修改测试的默认校准参数 。
文章插图
c语言 struct A{int a,b:A*C:}:大小为多少
12字节 。注意 , struct结构在计算字节大小时有一个问题 , 这个问题与struct中字节数最多的架构和变量有关 。
C语言 , 结构体问题?所占内在字节数 , 怎么算的???
C语言中如何计算结构长度和常用体长度?后结构体的长度等于体中每个成员变量的长度 。这个问题的长度是字符串数组的长度加上两个int变量的长度加上double的长度 , 最后的结果是10 ^ 2 ^ 2 ^ 8=22 。解析:char的每个字符占用一个字节(因为是十长字符数组) , 所以是10个字节 , int占用两个字节 , double占用八个字节 。所以最后一个是10 ^ 2 * 2 ^ 8=22 。共享长度是主体成员中最长的长度 。如果一个团体中最长的长度是12字节 , 团体的长度是12 。希望能帮到你 。如果你还有什么问题?
文章插图
结构体类型的长度计算
【struct大小计算 c 中如何计算一个struct的长度,c语言struct大小】计算方法:运算符sizeof可以计算给定类型的大小 。对于32位系统 , sizeof(char)=1;sizeof(int)=4 .基本数据类型的大小很容易计算 。让& # 039;让我们看看如何计算构造的数据类型的大小 。C中有三种类型的构造数据:数组、结构和公共体 。数组是同一类型元素的集合 。只要可以计算出单个元素的大小 , 那么整个数组所占的空间就等于基元素的大小乘以元素的个数 。结构中的成员可以是不同的数据类型 , 并且这些成员按照定义的顺序存储在连续的内存空间中 。与数组不同 , 一个结构的大小并不是其所有成员大小的简单总和 , 存储结构变量时要考虑系统的地址对齐问题 。看下面的结构:structstu1 { inticharcintj};先介绍一个相关概念 , ——偏移量 。Offset指的是结构变量中成员的地址和结构变量的地址之差 。结构大小等于最后一个成员的偏移量加上最后一个成员的大小 。显然 , 结构变量中第一个成员的地址就是结构变量的第一个地址 。因此 , 第一个成员I的偏移量为0 。第二个成员的偏移量C是第一个成员的偏移量加上第一个成员的大小(0 ^ 4) , 其值为4;第三个成员J的偏移量是第二个成员的偏移量加上第二个成员的大小(4 ^ 1) , 其值为5 。实际上 , 由于存储变量时地址对齐的要求 , 编译器在编译程序时会遵循两个原则:一是结构变量中成员的偏移量必须是成员大小的整数倍(0被认为是任意数的整数倍);其次 , 结构大小必须是所有成员的整数倍 。与第一个相比 , 上例中前两个成员的偏移量满足要求 , 但第三个成员的偏移量为5 , 不是自身(int)大小的整数倍 。编译器会在处理过程中向第二个成员添加3个空字节 , 这样第三个成员的偏移量就变成了8 。与第二条相比 , 结构的大小等于最后一个构件的偏移量加上它的大小 。上例中计算的大小为12 , 符合要求 。再看另一种满足第一个子句但不满足第二个子句的情况 , structstu2 { intk肖特;};k的偏移量为0;成员T的偏移量是4 , 所以不需要调整 。但是计算出来的大小是6 , 显然不是成员k大小的整数倍 , 所以编译器会在成员T后面加2个字节 , 这样结构的大小就变成了8来满足第二个要求 。所以我们在定义结构类型的时候需要考虑字节对齐 , 不同的顺序会影响结构的大小 。比较下面两个定义序列:structstu3 { charc1inticharc2} structstu4 { charc1charc2inti}虽然stu3和stu4中的成员相同 , 但是sizeof(structstu3)的值是12 , sizeof(structstu4)的值是8 。如果结构中的成员属于另一种结构类型 , 应该怎么办?打开它 。然而 , 应该注意 , 扩展结构的第一个成员的偏移量应该是扩展结构的最大成员的整数倍 。看下面这个例子:structstu5 { shortistruct { charcintj} ssintk}结构stu5的构件ss.c的偏移量应该是4 , 而不是2 。整个结构尺寸应为16 。如何为结构变量分配空间取决于编译器 。以上情况是针对linux下的gcc 。其他平台的c编译器可能会有不同的处理方式 。
推荐阅读
- 十几岁如何保护皮肤呢 十几岁如何保护皮肤,十几岁如何保护皮肤健康
- 电商童装秋款一般什么时候上
- 媒介如何影响你的生活状态 媒介如何影响你的生活,媒介如何影响你的生活方式
- 如何评价《水浒传》中的招安人 如何评价《水浒传》中的招安,如何评价《水浒传》中的招安人物
- 如何解决媒介依赖症的方法 如何解决媒介依赖症,如何解决媒介依赖症问题
- 如何实现自我传播功能 如何实现自我传播,如何实现自我传播能力
- 红娘职业好吗 红娘的职业前景如何,红娘这个职业有什么发展前景
- 如何治疗加龄丑
- 老滚5任务做完了怎么办 老滚5如何跳过任务,老滚五怎么跳过任务