[英]Can anyone please explain what this C++ code is doing?
char b = 'a';
int *a = (int*)&b;
std::cout << *a;
*a
的內容*a
什么? 它顯示了垃圾值。 誰能解釋一下。 為什么?
假設char在內存中占用一個字節,而int占用兩個字節(確切的字節數取決於平台,但是char和int通常不相同)。 您將a
設置為指向與b
相同的存儲位置。 在b
情況下,取消引用將僅考慮一個字節,因為它的類型為char。 在的情況下, a
解引用將訪問兩個字節,因此將打印存儲在這些位置中的整數。 這就是為什么會產生垃圾:第一個字節為'a'
,第二個字節為隨機字節-它們一起為您提供了一個隨機整數值。
您可以使用數據類型char
初始化變量。c++中的char
應該具有1個字節,而int
應該包含2個字節。 您的a
指向b
變量的地址...地址應定義為任何十六進制數。 每次調用此“程序”時,都應該有其他十六進制數,因為如果您重新啟動該程序,則調度程序會將其他任何地址分配給您的變量。
根據字節順序,第一個或最后一個字節應為十六進制61。 其他三個字節是垃圾。 最好將int更改為unsigned int並將cout更改為十六進制。
我不知道為什么有人會這樣做。
將其視為字節塊。 字符有一個字節塊(8位)。 如果設置了轉換(int *),則將從char地址中獲取接下來的7個字節塊。 因此,您將獲得7個隨機字節塊,這意味着您將獲得一個隨機整數。 這就是為什么您獲得垃圾值。
該代碼調用未定義的行為,垃圾是未定義的行為的一種形式,但是您的程序也可能會導致系統沖突並崩潰,從而帶來更多后果。
int *a = (int*)&b;
使用char
地址初始化指向int
的指針。 取消引用此指針將嘗試從該地址讀取一個int
:
sizeof(int)
在地址字節,只有那些之一將是a
,( 0x61
在ASCII),但該有的都有了待定值(又名垃圾 )。 實際上,在某些體系結構上,從未初始化的內存讀取可能會引起問題:例如在valgrind
下,這將導致向用戶顯示警告。 以上都是推測,未定義的行為表示可能發生任何事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.