结构体在程序中的应用是很广泛的,要处理的问题越复杂,数据量越多月杂,就越需要用到结构体。比如网络,内核,驱动等等。熟练使用结构体对每个程序员都是至关重要的。一个好的结构体不仅能使程序体系结构清晰,而且使得操作灵活,可扩展性强。linux网络之所以很强大,这和它里设计合理的数据结构有很大关系。
结构体定义:
struct a{
int xx:4;
int yy:4;
};
结构体初始化:
方式一:
struct a aa ={
xx:2,
yy:3
};
方式二:
struct a cc ={
.xx=6,
.yy=1,
};
方式三:
struct a dd={4,2};
在定义中,可以限制变量的位的作用域,比如上面的:int xx:4;这表明xx的有效域只有4位,也就是能给他赋值的最大值为15,如果超过这个值,编译器就会报错:warning: overflow in implicit constant conversion。
在这里如果你给xx赋值为15,如:
struct a cc ={
.xx=15,
.yy=1,
};
然后输出:
printf("cc.xx = %d\n",cc.xx);
结果会是:-1
因为这里定义的xx为int 型,15的二进制位1111,最高位为1,表示为负数,所以取反加1后为0001。所以是-1。
这种位域操作的好处是当你不需要用到你定义的类型的长度时,可以加位域操作以节省内存空间。
引出的其他问题
这里用sizeof(struct a)得到的是4,如果不加位域限制则是8,至于为什么是4呢?4bit+4bit应该刚好是1byte啊,应该是1才对啊。这是因为我是在linux下编译执行的,而在linux对内存分配最小值为类型值的一半。(我在linux下做了实验)如下我定义了一个结构体:
struct a{
short int xx:2;
short int yy:2;
}bb;
如上,我定义二个short int类型值,short int在32位linux下为2字节,这里二个相加不足一字节,但是输出sizeof(struct a)的值为2。不足一字节系统自动补满一字节。
struct a{
short int xx:9;
short int yy:2;
}bb;
这个输出也是2。xx超过一字节,但是9+2=11,还没有超过16(2字节),我猜系统将xx超过的那1bit分到了yy那1bit里面了。
struct a{
short int xx:9;
short int yy:9;
}bb;
这个输出是4。9+9=18,超过了16,系统各分配了2字节给xx和yy。
分享到:
相关推荐
c++结构体string无法用malloc分配内存,需要用用new来分配内存,malloc不会调用结构函数,结构体内的string不定长,不能动态分配内存。
结构体内存对其计算结构体大小,大神总结,很有用,结构体内存对其计算结构体大小,结构体内存对其计算结构体大小结构体内存对其计算结构体大小
提示:不能使用指针pcarinfo将已分配的内存区域释放,因为此时由于for循环内pcarinfo做自增运算,其所指位置已不再是动态分配内存的首地址了,因此必须使用pcarinfo释放动态分配的内存。 #include #include struct ...
详细的介绍了如何计算结构体在内存中的分布,从而达到计算结构体类型所占内存大小的目的。
sizeof(结构体)和内存对齐 sizeof(结构体)和内存对齐 sizeof(结构体)和内存对齐 sizeof(结构体)和内存对齐
从结构体内变量所占空间大小,默认内存对齐大小,强制内存对齐方法,变量在内存中布局的详细分析,语言言简意赅,绝无废话,为读者解决了大量寻找书籍的烦恼,读者可以花费几分钟的时间解决掉结构体内存对齐的所有问题,...
之前在网上找的都是只能传递字符串的共享内存,转换成结构体格式经常出现无法读取的问题
这个是Linux 输入事件所有宏定义,从vscode追到的,可以通过EV_KEY这宏定义追,不会追就直接下载文件吧。
关于结构体的内存对齐关于结构体的内存对齐关于结构体的内存对齐
本文分析了Java中堆内存与栈内存分配的异同
Linux C socket通信传输结构体消息,Java解析C语言结构体里的数据
分析内存及偏移的工具。 可进行游戏内存及其他结构化内存的分析查询.
vc++6.0 LoadLibrary方式调用HeapDLL.dll,测试HeapDLL.dll 的对外接口(含int传参、结构体传参、堆内存分配与释放)。 三、VbCallVcDll vb6.0 调用HeapDLL.dll,测试HeapDLL.dll 的对外接口(含int传参、结构体传参、...
linux socket编程 常用结构体 详解很好的资源,解释详细
socket传输结构体的解决办法,一般的socket只能传输字符串,怎么解决这个问题呢?看看这个吧
有关linux下USB驱动相关结构体解释 LDD3解释的太过混乱,希望这篇文档对于大家有帮助!
C语言结构体的内存大小
一个简单的C++ UDP接收结构体数据的例子,包含大小端转换说明,博客https://blog.csdn.net/guimaxingtian/article/details/100030614中的最终代码
共享内存的属性结构体 struct shmid_ds
(1)struct file结构体定义在include/linux/fs.h中定义。文件结构体代表一个打开的文件,系统中的每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建,并传递给在文件上进行操作的任何...