a的值怎么是0,而且b的值改变到较大值11111111,a的值又会发生改变? 20
朋友,你这题是有点深度的,而且答案不一定唯一。这种结果,通常是如下造成的:在小端机情况下,C/C++在安排变量时是从高地址向低地址的顺序进行的,这里就是在低地址开始安排d,再安排c,依次到最高地址安排a。并且,变量都从偶数地址开始存放,如果“紧挨着”的不是偶数地址就要空一个(对char型,后面通常空3个,就是要让字符变量也占4字节,但只用前面1个字节,可能是要与int占用字节数看齐);我们假设d是从1000开始的,那么这4个变量这么安排:
1000:d(double占8字节)
1008:c(char占1字节)
1009:空
1010:空
1011:空
1012:b(4个char元素占4字节)
1016:a(int占4字节)
1020:结束,这个单元不受该代码控制。
现在我们看上述现象是怎么造成的。输入32 7921 23123 2132131后,a接收32,接着b接收4个字节7921,可是由于b是字符串,还要在末尾加一个'\0','\0'其实就是0,但b只分配了4字节(1012-1015),'\0'就只能放在1016里了,可那里放的是a的低字节32,结果把32变成了0,所以最后使a为0了。后面c是cahr型只接收1个字符,所以把23123中的第一个字符2接收了;最后3123赋给了d;后面的2132131由于没有接收变量就遗留在了输入缓冲区中……所以造成了你提供的输出结果。很好验证,把a输入大一点,让占1个以上的字节,这样'\0'只覆盖a的最低字节,从第2字节开始还非0数据,所以输出a就肯定不是0了。比如输入332,a最后应该是256。你也可以把char b[4];改为char b[5];,同样在对应的地方输入4个字符,就不会出这问题了;若输入5个字符,也不会出这问题,因为5是奇数,后面那个单元空着,没有分配给a;还有,输入时第二个数不要输入4位而是3位,让那个'\0'不要侵占为a分配的单元就不会有错……供参考。
可是输入给b的数据超过4位数时,b能完整输出,b不是4个元素的字符数组吗?但a的值不再是‘\0’的值