[英]Can someone please explain the output of this C program?
这是代码:
int a=256;
char *x= (char *)&a;
*x++ = 1;
*x =x[0]++;
printf("a=%d\n", a);
输出是:
a=257
诠释a = 256;
初始化整数变量,值为 256。在 little-endian 机器上,内存布局为:
00 01 00 00 ...
字符 *x= (字符 *)&a;
x
是指向 a 的最低有效字节a
指针(在小端机器上)。
00 01 00 00 ...
^ -- x points here
*x++ = 1;
将x
指向的字节设置为 1,然后将x
移动到下一个字节。 内存是:
01 01 00 00 ...
^-- x points here
*x =x[0]++;
未指定的行为, *x
和x[0]
是相等的( x[0]
是*(x+0)
)。 在您的实现中忽略后增量。
UPD:实际上它并没有被忽略,而是被赋值覆盖。 x[0]++
增加第二个字节:
01 02 00 00
^ -- x
然后在增量( 01
)之前取的值由*x=
放置到同一位置
01 01 00 00
我将一次一行地使用发布的代码。
int a=256;
我认为这很简单。
char *x= (char *)&a;
这将char
指针设置为仅指向多字节int
值的一个字节。 这是一个低级的、依赖于机器的、不一定有意义的操作。 (另外, x
是一个糟糕的、单一的指针变量名称。)
*x++ = 1;
这既设置了x
指向的字节,又增加了x
以指向下一个字节。 一般来说,这是一个明智的操作——例如,我们经常一次将字符填充到文本缓冲区中。 但是,在这种情况下,它是没有意义的,因为很少会一次移动一个int
变量的字节,设置或更改它们。
*x =x[0]++;
而这条线完全没有意义。 我不会试图解释它的作用,因为我确实不能。
printf("a=%d\n", a);
显然,这会打印a
的值,尽管在经历了糟糕a
之后,很难说它的位和字节会留下什么样的血腥混乱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.