位段的内存分配

简介: 位段的内存分配

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


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


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进制位!!


相关文章
|
6月前
|
存储 算法 大数据
内存原理 | 内存分配 | 内存对齐
内存原理 | 内存分配 | 内存对齐
|
程序员 编译器 C语言
动态内存函数,内存开辟,柔性数组(超详细)
动态内存函数,内存开辟,柔性数组(超详细)
72 0
|
5月前
|
编译器 C语言 C++
C语言学习记录——位段(内存分配、位段的跨平台、位段的应用)
C语言学习记录——位段(内存分配、位段的跨平台、位段的应用)
54 0
|
6月前
|
Kubernetes 网络性能优化 调度
k8s的内存分配
k8s的内存分配
|
程序员 编译器 C语言
程序内存的开辟+柔性数组
程序内存的开辟+柔性数组
90 0
|
存储 程序员 编译器
位段(详解)
位段又叫做位域,具体是一种可以把数据以位的形式紧凑的存储,并允许程序员对此结构位进行操作的数据结构。
149 0
|
存储 安全 程序员
内存分配理解
内存分配理解
151 0
|
存储 C语言
内存分配与编译处理
内存分配与编译处理
123 0
内存分配与编译处理
|
编译器 C++
C/C++ | 你认识位段吗?
结构体讲完就得讲讲结构体实现位段的能力。位段就像结构体的一种变形,相信很多铁汁都没有听说过,不着急,现在来学学看把~
71 0
C/C++ | 你认识位段吗?
|
安全 C++
C++指针的内存分配与内存安全
C++指针的内存分配与内存安全
139 0