【C语言】结构体占用字节数及存储与空间分配
2016-09-01 00:03
267 查看
我们都知道在数据类型中,char类型占1个字节,short占2个字节,int占4个字节,long占8个字节等等。
在计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的,每个单元多大取决于结构体中最大基本类型的大小,下面我们看几个例子:
1.
struct A{ char a; int b; short c;}str1;这里char占1个字节,int占4个字节,short占2个字节,按单元存放如下图:
1 2 3 4
a | |||
b | b | b | b |
c | c |
由于a占用了1个字节,b存不下,所以开辟新的单元存放b,然后再开辟新的单元存放c。
从这里可以看出结构体在内存中是按单元存放的,总占用字节数就是3*4=12。
2.
struct B{ char a; short c; int b;}str2;存放如图:
1 2 3 4
a | c | c | |
b | b | b | b |
在这里由于b占用4个字节,而a和c总共才占用3个字节,足够c存放,所以c存放在a的后面,再开辟新的单元存放b。
此例中占用字节数为2*4=8。
3.
struct c{ char a; char b[2]; char c[4];}str3;存放如图:
1 2 3 4 5 6 7
a | b | b | c | c | c | c |
这里由于数据类型都为char类型,故不必再开辟新的单元,一行存完。
占用字节数为1*1+2*1+4*1=7。
综上所述,结构体在内存中存放是按单元存放的,所开辟单元的最大长度取决于占字节最大的数据类型,此外我们可以发现存储顺序对空间的使用率有一定的影响。
从以上三例可以看出,第一种最浪费空间;第三种最节省空间,但全使用相同类型,丢失了字段本生的数据类型,不方便使用;第二种介于第一种和第三种写法之间,其空间上比较紧凑,同时又保持了结构体中字段的数据类型。大家可以尝试用sizeof()去深入了解结构体中的按单元存放。
相关文章推荐
- 结构体占用字节数及存储与空间分配(转)
- 【C语言】结构体存储与空间分配
- C语言 结构体存储空间分配
- C语言 结构体存储空间分配
- 为结构体分配额外存储空间的方法
- C语言结构体占用空间内存大小解析
- C语言结构体内存空间分配
- 定义一个结构体指针需要分配存储空间?
- 定义结构体指针时,有没有同时分配存储空间?
- [华赛面试题] C语言 通过sizeof计算变量占用的存储空间
- C语言中结构体和共同体在内存中占用字节数
- 操作系统-c语言实现空闲块表的存储空间的分配和回收
- c++类不含有数据成员(静态除外),则不会为该类实例分配存储空间,该类实例只占用一个字节空间
- c语言中结构体存储空间确定
- C语言结构体占用空间内存大小解析
- C语言 局部变量存储空间的分配和释放 奇怪现象及猜想
- 关于C语言字节对齐之结构体 共用体占用字节数的快速计算方法总结
- 存储空间动态分配
- C语言中结构体大小计算即存储分配
- 存储空间的动态分配与释放