簡體   English   中英

誰能解釋這個C ++代碼在做什么?

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

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