难理解的c代码(1)

来源:互联网 发布:乱世佳人电影结局知乎 编辑:程序博客网 时间:2024/06/07 00:18
#include <stdio.h>int main(){union{int ig[4];char a[8];}t;t.ig[0] = 0x4241;t.ig[1] = 0x4443;t.ig[2] = 0x4645;t.ig[3] = 0x0000;printf("\n%s\n", t.a);return 0;}

先看结果:

到这里,还很蒙。

试试下面程序:

#include <stdio.h>int main(){union{int ig[4];char a[8];}t;t.ig[0] = 0x4241;t.ig[1] = 0x4443;t.ig[2] = 0x4645;t.ig[3] = 0x0000;//printf("\n%s\n", t.a);printf("%d\n",sizeof(t));return 0;}
结果:

可以看到,union长度为16,则可以推知:union中的int是4字节,char是一字节(这个是学c的都知道的)

试试下面程序:

#include <stdio.h>int main(){union{int ig[4];char a[8];}t;t.ig[0] = 0x4241;//t.ig[1] = 0x4443;//t.ig[2] = 0x4645;//t.ig[3] = 0x0000;printf("\n%s\n", t.a);//printf("%d\n",sizeof(t));return 0;}

结果:

可以看到,结果为AB,因为0x4241中,41是存储在低位的,也就是ig数组的头部地址,这样先输出0x41(A),再输出0x42(B)

但是把 t.ig[1] = 0x4443的注释去掉后,发现结果仍是AB,why?后来才想到,每一个元素是32位,而0x4241才占用了16位,后面16位是空的,这样当读到后8位的时候,因为无内容,则停止读取,所有后面即使为ig数组中的其他元素赋值,也不会输出了。

可以用下面的程序做尝试:

#include <stdio.h>int main(){union{int ig[4];char a[8];}t;t.ig[0] = 0x44434241;t.ig[1] = 0x4443;//t.ig[2] = 0x4645;//t.ig[3] = 0x0000;printf("\n%s\n", t.a);//printf("%d\n",sizeof(t));return 0;}

结果:

可以看到补齐ig[0]的后16位后,结果为ABCDCD,这时候就明白了。


原创粉丝点击