C语言学习记录——유십일 一点练习题

目录

1

2

3


1

int main()
{
    unsigned char puc[4];
    struct tagPIM
    {
        unsigned char ucPim1;
        unsigned char ucData0 : 1;
        unsigned char ucData1 : 2;
        unsigned char ucData2 : 3;
    }*pstPimData;
    pstPimData = (struct tagPIM*)puc;
    memset(puc, 0, 4);
    pstPimData->ucPim1 = 2;
    pstPimData->ucData0 = 1;
    pstPimData->ucData1 = 2;
    pstPimData->ucucData2 = 3;
    printf("%02x %02x %02x %02x\n", puc[0], puc[1], puc[2], puc[3]);
    return 0;
}

输出02 29 00 00。puc分成四个部分,每一个都占据一个字节,现在把它的首元素地址强制转换为结构体类型,然后给了pstPimData,所以pstPimData就指向了puc的首元素,借助此就可以访问整个数组。现在存放结构体变量,Pim1占据puc[0],而puc[1]里,Data0占1个比特位,Data1占2个,Data2占3个。之后改变数值,puc[0]存放的就是00000010,而puc[1]里,假设是小端存储,data0是01,只有一个比特位,所以留1;data1是10,有2个比特位,所以留10;data2是101,有3个比特位,所以留101,所以puc[1]整体就是001011001,也就是29,puc[2]    puc[1]都为0,所以最终结果就是02 29 00 00。

2

#include <stdio.h>

int main()
{
    union
    {
        short k;
        char i[2];
    }*s, a;
    s = &a;
    s->i[0] = 0x39;
    s->i[1] = 0x38;
    printf("%x\n", a, k);
    return 0;
}

a是这个联合体的名,s指针指向它,把a的地址放到s里,联合体共用一块内存,所以整个联合体就是2个字节。如果是小端存储,打印出来就是3839。

3

malloc不可以向内存申请0字节的空间,这样会返回正常的地址,但是却不能使用。malloc开辟完后也必须释放内存。free也可释放NULL指针。

结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值