#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.youkuaiyun.com/weixin_42856843/article/details/82152144