C语言结构体,联合体,枚举体的内存大小计算方法

原创 2016年12月17日 11:10:25
结构体的定义:
struct stu{
char*name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
}s1;

其中 stu 为结构体的 类型名;
s1为 结构体变量名

结构体的大小:
以字节最大的单位 为地址对齐标准 ,如 结构体中 最大为 double,8个字节,那么 比它小的
单位就要凑齐 8的整数倍 字节大小。

例如:

struct stu
{
double c;
int s;
char k;
}a;

double --8,int ---4,char ---1;所以以8字节对齐,总字节大小为8的倍数
 8+4+1=13,而8字节对齐后,为16。

再例如:
struct stu
{
double c;
int s;
char k;
int l;
}a;

a 的大小为 24;

struct stu
{
double c;
char k[9];
}a;

a 的大小为24



用途:
当多个数据需要共享内存 或 多个数据每次只能取其一时,可以用联合体(union)
存储方式:
联合体的每一项元素起始地址都一样,都跟联合体 union 的地址偏移量为0;
联合体的内存计算:
此结构的容量要容纳最大的一个元素,而且要字节对齐其他元素的大小
例如:
union U
{
    char s[9];             //9个字节
    int n; //4个字节
    double d; //8个字节
};

union U中最大的是 9 个字节的 s[9],但 9 不能被 4 和 8 同时整除,而16可以,且16比9大。
所以 联合体所占空间 为16 个字节
如:

union {  
int i;  
char x[2];  
}a;  

int main(void)  
{  
a.x[0] = 10;  
a.x[1] = 1;  
printf("%d\n",a.i);  
return 0;  
}  
由于 PC 机位小端序,因此 低字节放低地址。
对 x[2]赋值后,union 的地址空间的值为:
            高地址    0000 0000|0000 0000|0000 0001| 0000 1010   低地址 (4个字节的存储空间)
因为 i 为 4 个字节,所以输出 256+10 = 266;


union u{  
int i;  
char x[2];  
};  

int main(void)  
union u a;
memset(&a,0,sizeof(a));      //这步很关键,否则 union 的起始内存地址不会全是0,而是不确定
                                  会造成无法预测 union u a 中 元素的值
a.x[0] = 10;  
a.x[1] = 1;  
printf("%d\n",a.i);  
return 0;  
}  




enum
在实际应用中,有的变量只有几种可能取值。如人的性别只有两种可能取值,星期只有七种可能取值。在 C 语言中对这样取值比较特殊的变量可以定义为枚举类型。
enum weekday
{
sun,mon,tue,wed,thu,fri,sat
}day;
限定枚举变量 day 的值只能是 sun ,mon ,tue, thu,fri,sat 其中一种
day = mon ,or day = tue ,or day = sun................


枚举体的大小:
和指针一样,通通占4个字节。

定义一个枚举体:例如
enum weekday
{
sun,mon,tue,wed,thu,fri,sat
};

Mon、Tues、Wed 这些名字都被替换成了对应的数字。这意味着,Mon、Tues、Wed 等都不是
变量,它们不占用数据区(常量区、全局数据区、栈区和堆区)的内存,而是直接被编译到命令里
面,放到代码区,所以不能用&取得它们的地址。这就是枚举的本质。

初始化一个枚举变量:(2种办法)
(1)enum weekday day1;
(2)enum weekday{sun,mon,tue,wed,thu,fri,sat} day; 

枚举类型的值:
① 枚举元素不是变量,而是常数,因此枚举元素又称为枚举常量。因为是常量,所以不能对枚举
元素进行赋值。 

② 枚举元素作为常量,它们是有值的,C 语言在编译时按定义的顺序使它们的值为,1,2,…。 
如:
enum weekday
{
sun,mon,tue,wed,thu,fri,sat
};
默认下,sun = 0,mon = 1,tue = 2,依次加 1;

当然,也可以指定加的顺序:
enum weekday{sun = 1,mon,tue,wed,thu,fri,sat};
则 sun =1,mon =2 ,tue = 3...依次加一。
--------------------------------------------------------------------------------------------------
几种 enum 情况:

enum weekday{
	sun=1,mon=7,tue,wed,thu,fri
}day;

当 day = tue,printf(”%d“,day);结果 day = 8;同理,当 day = wed,day = 9;
enum weekday{
	sun=1,mon=7,tue=mon+3,wed,thu,fri
}day;


当 day = tue,打印day 的值,day = 10;

版权声明:本文为博主原创文章,未经博主允许不得转载。

enum枚举变量所占内存大小

既然,struct结构体变量大小等于结构体中的各个成员变量所占内存大小总和,union共用体变量大小等于共用体结构中占用内存最大的成员的内存大小。 那么enum枚举变量所占内存大小怎么计算? 首先...
  • bulebin
  • bulebin
  • 2017年01月12日 23:57
  • 8303

结构体和枚举在内存中所占的实际大小

最近在面试中经常会遇到结构体在内存在所占字节的问题,本文总结如下:
  • u011216802
  • u011216802
  • 2014年09月20日 23:19
  • 1323

sizeof计算联合体大小

引言:本篇文章有一部分是在sizeof计算结构体大小的基础上进行说明的 1.联合体union特性 联合体所有成员变量共享内存,相对于联合体首地址偏移量都为0 同一时间只能存储1个被选择的变量,对其他成...
  • u011471286
  • u011471286
  • 2016年04月03日 16:39
  • 1763

我计算结构体和联合体大小的方法

#include struct A { int i; char ch[9]; }; void main() { ...
  • liuzijiang1123
  • liuzijiang1123
  • 2015年09月09日 21:06
  • 362

枚举变量的大小是多少?

在《C语言深度剖析》这本书中留有一个问题,枚举变量的大小是多少? 1、大家猜一下下面这段程序红色部分输出的结果是多少? 2、在printf(char *fmt.....)函数里,如需打印枚举变量里...
  • lwj103862095
  • lwj103862095
  • 2013年02月24日 20:27
  • 12948

枚举大小sizeof 中枚举的大小详解

至从C语言开始enum类型就被作为用户自定义分类有限集合常量的方法被引入到了语言当中,而且一度成为C++中定义编译期常量的唯一方法(后来在类中引入了静态整型常量)。 根据上面对enum类型的描述,有...
  • zzsfqiuyigui
  • zzsfqiuyigui
  • 2016年03月13日 09:40
  • 4456

【C语言】联合与枚举类型

本文主要介绍了关于C语言中联合体(union)和枚举类型(enum)的相关知识和内容。并提供了部分代码,可供学习。...
  • tracer9
  • tracer9
  • 2015年12月27日 21:00
  • 706

C语言入门(二十一)联合和枚举

联合和枚举  联合(union): 一、联合说明和联合变量定义  联合也是一种新的数据类型, 它是一种特殊形式的变量。 联合说明和联合变量定义与结构十分相似。其形式为: union 联合...
  • caihongdao123
  • caihongdao123
  • 2016年07月12日 17:09
  • 6722

结构体,联合体,枚举体这三种数据结构的感想

一、结构体        一般自己构造的数据结构类型(如数组)这只能放一种的数据类型。但是有时候需要多种不同的数据类型,这些数据类型是相互联系的,所以建立了一种新的数据类型--结构体。     ...
  • wan0229
  • wan0229
  • 2012年09月28日 16:27
  • 3068

C语言系列(六)结构体和联合体

转载请标明出处: http://blog.csdn.net/u011974987/article/details/52305364 本文出自:【XuHao的博客】 结构体在C语言中,可以使用结...
  • u011974987
  • u011974987
  • 2016年08月24日 23:57
  • 4253
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言结构体,联合体,枚举体的内存大小计算方法
举报原因:
原因补充:

(最多只允许输入30个字)