簡體   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