浅谈结构体及Linux下内存分配原则

发表于:2012-8-06 10:01

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:linuxblack125125    来源:51Testing软件测试网采编

  结构体在程序中的应用是很广泛的,要处理的问题越复杂,数据量越多月杂,就越需要用到结构体。比如网络,内核,驱动等等。熟练使用结构体对每个程序员都是至关重要的。一个好的结构体不仅能使程序体系结构清晰,而且使得操作灵活,可扩展性强。Linux网络之所以很强大,这和它里设计合理的数据结构有很大关系。

  结构体定义:

<SPAN style="FONT-SIZE: 18px">struct a{
 int xx:4;
 int yy:4;
};</SPAN>

  结构体初始化:

  方式一:

<SPAN style="FONT-SIZE: 18px">struct a aa ={
 xx:2,
 yy:3
};</SPAN>

  方式二:

<SPAN style="FONT-SIZE: 18px">struct a cc ={
 .xx=6,
 .yy=1,
};</SPAN>

  方式三:

<SPAN style="FONT-SIZE: 18px">struct a dd={4,2};</SPAN>

  在定义中,可以限制变量的位的作用域,比如上面的:int xx:4;这表明xx的有效域只有4位,也就是能给他赋值的最大值为15,如果超过这个值,编译器就会报错:warning: overflow in implicit constant conversion。

  在这里如果你给xx赋值为15,如:

<SPAN style="FONT-SIZE: 18px">struct a cc ={
 .xx=15,
 .yy=1,
};</SPAN>

  然后输出:

<SPAN style="FONT-SIZE: 18px">printf("cc.xx = %d\n",cc.xx);</SPAN>

  结果会是:-1

  因为这里定义的xx为int 型,15的二进制位1111,最高位为1,表示为负数,所以取反加1后为0001。所以是-1。

  这种位域操作的好处是当你不需要用到你定义的类型的长度时,可以加位域操作以节省内存空间。

  引出的其他问题

  这里用sizeof(struct a)得到的是4,如果不加位域限制则是8,至于为什么是4呢?4bit+4bit应该刚好是1byte啊,应该是1才对啊。这是因为我是在linux下编译执行的,而在linux对内存分配最小值为类型值的一半。(我在linux下做了实验)如下我定义了一个结构体:

<SPAN style="FONT-SIZE: 18px">struct a{
 short int xx:2;
 short int yy:2;
}bb;</SPAN>

  如上,我定义二个short int类型值,short int在32位linux下为2字节,这里二个相加不足一字节,但是输出sizeof(struct a)的值为2。不足一字节系统自动补满一字节。

<SPAN style="FONT-SIZE: 18px">struct a{
 short int xx:9;
 short int yy:2;
}bb;</SPAN>

  这个输出也是2。xx超过一字节,但是9+2=11,还没有超过16(2字节),我猜系统将xx超过的那1bit分到了yy那1bit里面了。

<SPAN style="FONT-SIZE: 18px">struct a{
 short int xx:9;
 short int yy:9;
}bb;</SPAN>

  这个输出是4。9+9=18,超过了16,系统各分配了2字节给xx和yy。

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号