[英]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.