簡體   English   中英

將char指針轉換為int指針是未定義的行為?

[英]is casting char pointer to int pointer a undefined behavior?

在某些來源中,我發現了以下內容:

uint32_t str_hash = *(*uint32_t)"CM1";

我相信這是未定義的行為,因為

  1. 它拋棄了const
  2. 輸入雙關

我錯了嗎? 還有其他違規行為嗎?

拋棄const並不是未定義的行為:僅寫入聲明為const的對象是未定義的行為。

除非您平台的char類型是無符號的,否則,是的,嚴格的別名禁止取消引用指針,並且行為是未定義的。 但是,在現實世界中,考慮到大多數編譯器對類型修剪的寬大處理,並且基礎對象是const,因此不太可能引起問題。

另外,在下面的評論中,davmac提出"CM1"可能未與uint32_t所需的對齊方式對齊。

安全的方法是使用memcpy

uint32_t str_hash;
memcpy(&str_hash, "CM1", sizeof str_hash);

使用Clang時,它只能編譯為一個負載(我認為它會獲得盡可能好的負載)。 也沒有放棄constness,盡管這與存在無關緊要。

暫無
暫無

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

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