C语言结构体,联合体,枚举体的内存大小计算方法
来源:互联网 发布:手机必备软件大全2016 编辑:程序博客网 时间:2024/05/17 22:45
结构体的定义:
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;
0 0
- C语言结构体,联合体,枚举体的内存大小计算方法
- C语言-结构体+联合体+枚举
- 枚举、结构体、联合体的简单应用程序-C语言
- [C/C++]结构体大小的计算方法
- C语言学习笔记10-结构体、枚举、联合体
- (四)C语言基础(结构体,联合体,枚举,别名)
- C语言结构体,联合体,枚举与typedef
- 对于结构体,联合体,枚举的总结。内存对齐及结构体大小问题,位段问题。
- 结构体、联合体、枚举
- 结构体、联合体、枚举
- 结构体大小的计算方法
- <C语言>结构体与联合体(共用体)的地址排布问题(内存字节对齐)
- 结构体、联合体、枚举的特性
- 结构体大小计算方法
- C语言基础-结构体和联合体
- C语言结构体和联合体
- C语言结构体和联合体
- C语言结构体和联合体
- 第一章 数据库基础
- python Mysql for 2.7
- 转换流InputStreamReader、OutputStreamWriter
- mysql+tomcat+jsp增删改查(三)
- 第二章 数据表管理
- C语言结构体,联合体,枚举体的内存大小计算方法
- MyEclipse快捷键使用总结(Me)
- [欧拉回路] BZOJ 2935 [Poi1999]原始生物 Primitivus
- ARM汇编DSB和ISB
- C#设置DataGridView的背景色(附:C#Color颜色对照表)
- Mysql库表数据随时从生产拉取到数仓(Mysql)的方案(1)
- innodb_fast_shutdown的内幕
- 7.2 Swift中switch匹配枚举
- Oracle 数据库常用Sql语句