簡體   English   中英

打印指針地址和&符地址之間的區別

[英]Difference between printing pointer address and ampersand address

int firstInt =10;
int *pointerFirstInt = &firstInt;


printf("The address of firstInt is: %u", &firstInt);
printf("\n");
printf("The address of firstInt is: %p", pointerFirstInt);
printf("\n");

上面的代碼返回以下內容:

The address of firstInt is: 1606416332
The address of firstInt is: 0x7fff5fbff7cc

我知道0x7fff5fbff7cc是十六進制的,但是當我嘗試將該數字轉換為十進制時,它不等於1606416332 為什么是這樣? 都不應該都返回相同的內存地址嗎?

原因在於:

C11:7.21.6:

如果轉換規范無效, 則行為是undefined 288)如果任何參數不是對應轉換規范的正確類型,則行為未定義。

從您的十六進制地址-

The address of firstInt is: 0x7fff5fbff7cc

地址的大小為6個字節長。 但是unsignedint大小為4個字節。 當您嘗試使用%u打印地址時,將導致未定義的行為。

因此,請始終使用%p打印地址。

看來您在64位計算機上工作。 所以你的指針長64位

兩者( &firstIntpointerFirstInt )完全相同。 但顯示方式不同。 "%p"知道指針是64位的,並以十六進制顯示它們。 "%u"顯示十進制數,並假定為32位。 因此只顯示了一部分。

如果將1606416332轉換為十六進制,則它看起來像: 0x5FBFF7CC 您會看到這是64位地址的下半部分。

編輯:進一步的解釋:

因為printf是一個var-arg函數,所以您賦予它的所有參數都放在堆棧中。 因為在這兩種情況下,您都將8個字節放在上面。 由於Pcs使用Little Endian,因此將較低的字節放在首位。 printf函數解析該字符串並到達%[DatatypeSpecifier]點,並從堆棧中讀取與DatatypeSpecifier引用的數據類型一樣多的字節。 因此,對於"%u"它僅讀取4個字節,而忽略其他字節。 由於您寫的是"%u"而不是"%x"因此它將以十進制而不是十六進制形式顯示值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM