位段的内存分配

简介: 位段的内存分配

 对于位段,笔者在上篇文章中,已经详细的讲解了:位段的基础知识!!下面笔者来带领大家,学习一下:位段的内存分配!请大家紧跟步伐!!


在此之前,还需要各位老铁知道一下基础知识:


1.位段的成员可以是:int  ,unsigned int ,signed int ,或者,char (属于整型家族)类型!


2.位段的空间是按照需要以4个字节(int )或者1个字节(char)的方式开辟的


3.位段涉及很多不确定的因素,位段是不跨平台的,注意课移植的程序应该避免使用位段!


下面笔者简单通过一个位段代码解析来带领大家走进:位段的内存分配!!


#include <stdio.h>
struct s
{
  char a : 3;  //3指的是:a占3个比特位
  char b : 4;
  char c : 5;
  char d : 4;
};
int main()
{
  struct s s1 = { 0 };  //初始化为:0
  s1.a = 10;
  s1.b = 12;
  s1.c = 3;
  s1.d = 4;
  printf("%d\n", sizeof(struct s));   //3
  return 0;
}

上面的这个代码,虽然看似残缺,但是,笔者通过带领大家在调试中监视一下内存中的数据!可以看出来想要的内容!


代码的运行结果为:


0a2653c851af460fa595bd959398a8f1.png


char 类型,1个字节,8个比特位!


首先:对于数据,在内存中的存储,都是以:二进制形式存储的!!


对于a = 10  ,a的二进制形式为:000000000000000000000000000001010;但是,由于:char a : 3;  //3指的是:a占3个比特位  ,所以,a的二进制位在存储的时候,发生截断!仅保留3个比特位:010;    同理可得:b = 12;  仅保留4个比特位:1100,对于:   c = 3;  仅保留5个比特位:00011;    对于d = 4;仅保留4个比特位:0100;


2d65d23f6d4748949b924e4057485923.png


在代码的初始状态下:全部初始化为0:


此时:


6de278e6d6694ce5bb08e7e842b7e74b.png


将a, b, c ,d 的内容放进去后的内容为::


12c3b7f3f8814309a195c64f051d4445.png34e8d716411043c08c7ffba9fbba23de.png


在上面的结果中:比特位是从地位向高位(从左边向右边)使用的,当左边剩下的位数不够的时候,丢弃掉,再重新开辟一个字节(char类型),再在那个重新开辟的字节内部,从右边向左边使用!!


上面的代码,经过调试可见:笔者就不再带领大家进行VS的调试了!大家可以自行调试!!


另外,在内存中,调试后的结果会为: 62 03 04  原因是:在内存中的观看情况为:4个2进制位为一个16进制位!!


相关文章
|
19天前
|
存储 算法 大数据
内存原理 | 内存分配 | 内存对齐
内存原理 | 内存分配 | 内存对齐
|
8月前
|
程序员 编译器 C语言
动态内存函数,内存开辟,柔性数组(超详细)
动态内存函数,内存开辟,柔性数组(超详细)
42 0
|
3天前
|
C语言 C++
动态内存分配
动态内存分配
|
19天前
|
存储 编译器 程序员
【C语言】内存的动态分配与释放
【C语言】内存的动态分配与释放
32 0
|
19天前
|
存储 编译器 C语言
结构体的内存对齐与位段
当我们描述一个人的年龄时我们可以使用,int age = 18;但是如果我们要描述一个人呢?很显然我们无法仅靠一个age就实现对一个人的描述,所以就有了结构体,在结构体中我们可以包含多种类型的数据,这样就可以实现对一个人的描述比如身高、爱好、体重等等
|
10月前
|
程序员 编译器 C语言
程序内存的开辟+柔性数组
程序内存的开辟+柔性数组
72 0
|
11月前
|
程序员 C语言 C++
【C语言】C/C++程序的内存开辟
【C语言】C/C++程序的内存开辟
|
12月前
|
存储 程序员 编译器
位段(详解)
位段又叫做位域,具体是一种可以把数据以位的形式紧凑的存储,并允许程序员对此结构位进行操作的数据结构。
126 0
|
C语言
C语言 堆区空间,malloc
前面测试,普通的数组变量默认最大不能申请1M的空间,甚至远少于1M的空间,毕竟程序中的其他变量也需要使用空间。总共就1M,要省着用。 想要使用更大的,没有限制的空间,C语言给我们提供了方式:
104 0
C语言 堆区空间,malloc
|
C语言 C++
C++中的动态内存分配
C++中的动态内存分配
109 0