C语言共用体内存计算

其实union(共用体)的各个成员是以同一个地址开始存放的,每一个时刻只可以存储一个成员,这样就要求它在分配内存单元时候要满足两点:  
1.一般而言,共用体类型实际占用存储空间为其最长的成员所占的存储空间;
2.若是该最长的存储空间对其他成员的元类型(如果是数组,取其类型的数据长度,例int a[5]为4)不满足整除关系,该最大空间自动延伸;

我们来看看这段代码:
union sample
{
short int n;//长度2
char c[10];//长度10
float f;//长度4
}s;

本来sample的空间应该是sizeof(char)*10=10;但是如果只是10个单元的话,那可以存几个float型(4位)呢?两个半?当然不可以,所以sample的空间延伸为既要大于10,又要满足其他成员所需空间的整数倍,即12

所以union的存储空间先看它的成员中哪个占的空间最大,拿他与其他成员的元长度比较,如果可以整除,ok ,否则,找第一个能被整除的数
又例如例子:


你明白了吗?



时间: 2024-10-24 14:47:23

C语言共用体内存计算的相关文章

C++ Primer 学习笔记_15_从C到C++(1)--bool类型、const限定符、const与#define、结构体内存对齐

欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 一.bool类型(C语言没有) 1.逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++中为1个字节. 2.声明方式:bool result; result=true; 3.可以当作整数用(true一般为1,false为0) 4.把其它类型的值转换为布尔值时,非零值转换为true,零值转换为false 5.示例 #include <iostream> using namespace

【APUE】Chapter17 Advanced IPC &amp; sign extension &amp; 结构体内存对齐

17.1 Introduction 这一章主要讲了UNIX Domain Sockets这样的进程间通讯方式,并列举了具体的几个例子. 17.2 UNIX Domain Sockets 这是一种特殊socket类型,主要用于高效的IPC,特点主要在于高效(因为省去了很多与数据无关的格式的要求). int socketpair(int domain, int type, int protocol, int sockfd[2]) 这个函数用于构建一对unix domain sockets:并且与之前

C语言中的边界计算与不对称边界(一)

1.如果一个数组有10个元素,那么这个数组下标的允许取值范围是什么呢? 这个问题对于不同的程序设计语言有着不同的答案.例如,对于Fortran,PL/I以及Snobol4等程序语言,这个数组的下标取值缺省从1开始,而且这些语言也允许编程者另外指定数组下标的起始值.而对于Algol和Pascal语言,数组下标没有缺省的起始值,编程者必须显式的指定每个数组的下界与上界.在标准的Basic语言中,声明一个拥有10个元素的数组,实际上编译器分配了11个元素的空间,下标范围从0到10. 在C语言中,这个数

struct结构体内存大小

一. 基本原则 1. struct中成员变量的声明顺序,与成员变量对应的内存顺序是一致的: 2. struct本身的起始存储地址必须是成员变量中最长的数据类型的整倍数,注意是最长的数据类型,而不是最长的变量 3. 内存对齐与编译器设置有关. 二. 计算规则(以下的所有规则,必须同时满足,并不是满足其中一条即可) 1. 每个成员变量相对于struct起始地址的偏移量,必须是成员变量自身类型长度的最小整倍数 int number:是声明的第一个成员变量,相对于S001起始地址的偏移量为0 doubl

关于结构体内存对齐方式的总结(#pragma pack()和alignas())

最近闲来无事,翻阅msdn,在预编译指令中,翻阅到#pragma pack这个预处理指令,这个预处理指令为结构体内存对齐指令,偶然发现还有另外的内存对齐指令aligns(C++11),__declspec(align(#))(Microsoft专用),遂去探究两者之间的不同点. 1.#pragma pack 这个指令为预处理指令,所谓与处理指令执行在程序的预处理阶段,该指令对应着编译选项/Zp,可以在vs的工程属性中设置编译选项的内存对齐,也可以利用预处理指令来设置. #pragma pack(

结构体内存对齐规则

结构体内存对齐规则 1.第一个成员在与结构体变量偏移量为0的地址处: 2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处: 对齐数=编译器默认的对齐数 与 该成员大小的较小值: vc中默认为对齐数为8 linux中默认对齐数为4 3.结构体总大小为最大对齐数的整数倍: 4.如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体 的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍 如下面代码 struct A { int a;//4  8   ->4 char c

C语言数值表示和计算

---恢复内容开始--- 一.数据类型 在我的Windows上查看<limit.h>可以看到对数据类型长度的定义 #define SHRT_MIN (-32768) // minimum (signed) short value#define SHRT_MAX 32767 // maximum (signed) short value#define USHRT_MAX 0xffff // maximum unsigned short value#define INT_MIN (-2147483

C语言设计ATM存取款界面

这个虽然很简单,但是我还是弄了一会儿,可见有多菜.练习算. 主要考察switch开关语句.do...while语句,页面的跳转我用的是goto,虽然是弊端,可是还是用了,因为太菜啊.大家有好建议的欢迎提出. 好了不说了,贴源码,欢迎各位网友老师,提出批评改进意见. 1 /** 2 * Copyright (c) 1991 - 2016 Arvin Tang. 3 * All rights reserved. 4 * 5 * 文件名称: 6 * 简要描述:用C语言实现ATM界面,很丑的说 7 *

【c语言】存款利息的计算

// 存款利息的计算.有1000元,想存5年,可按以下5种办法存: // 1.一次存5年期. // 2.先存2年期,到期后将本息再存3年期. // 3.先存3年期,到期后将本息再存2年期. // 4.存1年期,到期后将本息再存1年期,连续存5次. // 5.存活期存款.活期利息每一季度结算一次. // 1年定期利息:4.14%: // 2年定期利息:4.68%: // 3年定期利息:5.4%: // 5年定期利息:5.85%: // 活期存款利息:0.72%:(活期存款每一季度结算一次利息) /