繁体   English   中英

有人可以解释一下这个 C 程序的输出吗?

[英]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]++;

未指定的行为, *xx[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM