您身边的网站建设专家
成功案例

【建站服务】专业网站建设-网站设计-网站制作与网站开发-高端品牌企业宣传策划-塔城上往建站-域名申请

日期: 2022-09-21 05:43:47 浏览数:4


​

上往建站提供服务器空间服务商,百度快照排名,网站托管,百度推广运营,致力于设计外包服务与源代码定制开发,360推广,搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。


专业网站建设-网站设计-网站制作与网站开发-高端品牌企业宣传策划-塔城上往建站

网站建设.png

  1. }

    输出结果为:

    sizeof one_byte is : 1Bsizeof two_byte is : 2Bsizeof three_byte is : 3Bsizeof four_byte is : 4Bsizeof eight_byte is : 4B

    由输出,可以验证以下结论:

    (1)结构体内存分配原则:

    (2)定义位域时,各个成员的类型最好保持一致,比如都用char,或都用int,不要混合使用,这样才能达到节省内存空间的目的。

    xkl

       xkl

      923***865@qq.com

    3年前 (2019-04-09)
    • 原则一:结构体中元素按照定义顺序存放到内存中,但并不是紧密排列。从结构体存储的首地址开始 ,每一个元素存入内存中时,它都会认为内存是以自己的宽度来划分空间的,因此元素存放的位置一定会在自己大小的整数倍上开始。

    • 原则二: 在原则一的基础上,检查计算出的存储单元是否为所有元素中最宽的元素长度的整数倍。若是,则结束;否则,将其补齐为它的整数倍。

  2.    木子李

      Li1***052573@163.com

    67
    // 二进制表示为 1000 有四位,超出Age.age = 8;printf("Age.age : %d
    ", Age.age);

    超出范围并不是直接丢弃,而是保留对应的 3 位的值。

    比如 8 是 00001000,按照位域,对应 3 位的值是 000,所以打印结果是 0;

    但是 9 是 00001001,按照位域,对应 3 位的值是 001,所以打印结果是 1;

    同理 10 是 00001010,按照位域,对应 3 位的值是 010,所以打印结果是 2;

    Age.age = 9; // 二进制表示为 1001 有四位,超出printf( "Age.age : %d
    ", Age.age );
       Age.age = 10; // 二进制表示为 1010 有四位,超出printf( "Age.age : %d
    ", Age.age );
    // 以下是 4,7,8,9,10 的打印结果Sizeof( Age ) : 4Age.age : 4Age.age : 7Age.age : 0Age.age : 1Age.age : 2
    木子李

       木子李

      Li1***052573@163.com

    3年前 (2019-08-23)
  3.    xuxing

      176***6295@qq.com

    4

    三楼@xkl,结果是:

    sizeof one_byte is:1sizeof two_byte is:2sizeof three_byte is:3sizeof four_byte is:4sizeof eight_byte is:8

    讲一下为什么 struct ONE_BYTE,其 3 个位域都是 char 类型,所以可以按照位的顺序存储(不用分字节),1+1+4=6 位,占用 1 个字节。

    struct TWO_BYTE,道理同上,4+4+4+4=16 位 =2 个字节。

    struct THREE_BYTE,道理同上,4*5=20 位,占 3 个字节(不足的 4 位补 0)。

    struct FOUR_BYTE,其 2 个位域都是 int 类型,所以可以按照位的顺序存储(不用分字节),一个 int 类型占 4 个字节,刚好 16+16=32 位 =4 个字节。为 int 类


讲一下为什么 struct ONE_BYTE,其 3 个位域都是 char 类型,所以可以按照位的顺序存储(不用分字节),1+1+4=6 位,占用 1 个字节。


struct TWO_BYTE,道理同上,4+4+4+4=16 位 =2 个字节。


struct THREE_BYTE,道理同上,4*5=20 位,占 3 个字节(不足的 4 位补 0)。


struct FOUR_BYTE,其 2 个位域都是 int 类型,所以可以按照位的顺序存储(不用分字节),一个 int 类型占 4 个字节,刚好 16+16=32 位 =4 个字节。为 int 类型所占字节数的 1 倍(整数倍),所以 sizeof(four_byte)=4。


struct EIGHT_BYTE,其 2 个位域为不同的类型,所以它们的位值不能写到一个字节里面(不能按连续字节存储),那么,ccc1 就占第 1 个字节(地址0)的第 1 位;那么再来找 ccc2 存储的字节,因为其为 int 型,而 int 型占用 4 个字节,因此系统默认就要从 4 的整数倍的地址存它,也就是说要么存第 1 到第 4 个字节(地址0-地址3),要么存第 5 到第 8 个字节(地址4-地址7),……,以此类推,但是第 1 个字节(地址0),已经存了 ccc1 了,所以它就只能存第 5 到第 8 个字节,至于其前面的 3 个字节,补0;因此最后判断 eight_byte 占用 8 个字节,最后验证 8 个字节数刚好是 EIGHT_BYTE 结构体中占用最宽字节数的类型(int型)——4个字节的整数倍(2倍),所以就是 sizeof(eight_byte)=8。


xuxing

   xuxing


  176***6295@qq.com


4个月前 (05-04)

   Ethan


  186***29376@163.com


1

@xuxing,关于最后的 struct EIGHT_BYTE 的所占用内存大小的分析是有误的,unsigned int 类型需要用 4 个字节的内存空间来存储,unsigned char 类型需要 1 个字节的内存空间来存储,但是这里位域使用方面,cc1 和 cc2 都只使用了 1 位,即各占用 1 个 Bit,所以系统按照 cc1 的 unsigned int 类型开辟了 4 个字节来存放这个位域变量,所以最终 sizeof(eight_byte) 的结果应该是 4 才对。


当然你可以尝试将 cc2 的位域占用改成 32,这里由于 4 个字节的空间已经不够存放两个位域变量了,所以就需要按照为 int 类型所占字节数的 2 倍来为其开辟空间,即这里便需要 8 个字节了。


#include <stdio.h>

struct EIGHT_BYTE

{

    unsigned char ccc1 : 1;

    unsigned int ccc2 : 32;

} eight_byte;

int main(void)

{

    printf("sizeof eight_byte is : %lu ", sizeof(eight_byte));

    return 0;

}

得到的结果为:


sizeof eight_byte is : 8

倘若将 cc2 的位域空间改成 31,则这里存储空间大小仍是 4 个字节。


#include <stdio.h>

struct EIGHT_BYTE{    

    unsigned char ccc1 : 1;    

    unsigned int ccc2 : 31;

} eight_byte;

int main(void){    

    printf("sizeof eight_byte is : %lu ", sizeof(eight_byte));    

    return 0;

}

得到的结果为:


sizeof eight_byte is : 4


专业网站建设-网站设计-网站制作与网站开发-高端品牌企业宣传策划-塔城上往建站


上往建站提供搭建网站,域名注册,官网备案服务,网店详情页设计,企业网店,专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管,网页美工排版,致力于域名申请,竞价托管,软文推广,全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机,网站推广,百度竞价托管,网站建设,上网建站推广服务,网络公司有哪些等业务,专业团队服务,效果好。

服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)


全国咨询热线:400-111-6878

地址:全国各地都有驻点商务

Copyright © 2021 通陆科技

网站建设:上往建站