共用体问题

#include <stdio.h>
#include <stdlib.h>

int main()
{
    union
    {
        char i[2];
        short int m;

    }r;
    r.i[0]=2;
    r.i[1]=0;
    printf("%d",r.m);

}

该程序输出结果为2,即在共用体中m的值为2.
首先分析,这是一个共用体,共用体内存大小为当中最大的那个成员,而该共用体中成员有一个字符数组和一个short整型变量,都是2字节,因此,这两个成员共用一块2字节内存。
执行r.i[0]=2时,即在2字节内存中的第一个字节处赋值一个ascll码为2的字符。
执行r.i[1]=0时,即在2字节内存中的第二个字节处赋值一个ascll码为0的字符,该字符为空字符。
之后,这个2字节内存时一个ascll码为2和0的字符组成的字符串(字符数组)而该数组本来的长度就为2字节,若要成为字符串,后面还得加一个\n,这样便成了三字节,因此这里ascll码为0的字符为空字符,这样可以使该字符数组成为一个仅含一个字符的字符数组。
因此,m的值为这个字符数组的ascll码,而ascll码为0的字符是空字符,故m的值为第一个字符的ascll码,即m=2.
为了验证,可以给i[1]赋值一个非零值,此时m的值变化很大,即m此时是两个非空字符组成的字符数组的asccl码值。附上ascll码表https://blog.csdn.net/weixin_42856843/article/details/82152144

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值