簡體   English   中英

將malloc的結果轉換為char(不是char *) - 為什么編譯器沒有抱怨?

[英]Casting result of malloc to char (not char*) - why doesn't compiler complain?

tmpString = (char*)malloc((strlen(name) + 1) * sizeof(char));
tmpString = (char )malloc((strlen(name) + 1) * sizeof(char));

這兩行之間有什么區別?

我的理解是第二行是錯誤的,但由於某種原因,編譯器什么也沒說。

第一行轉換(void)指針,malloc返回指向char的指針,從而保留其指針。 所有它告訴編譯器“位置X的內存應該被視為字符數組”。

第二個轉換將malloc返回的指針轉換為單個字符。 由於多種原因,這很糟糕:

  • 當你把指針變成完全不同的東西時,你會丟失指針
  • 你也失去了指針的大部分數值,因為字符的大小遠小於指針的大小(在很多情況下,指針大小為32位或64位,但字符只有8位)位)並且“多余”位被丟棄。

我認為警告級別設置得足夠高的編譯器應警告第二次分配。

第二行是錯誤的(轉換為char會將指針截斷為只有一個字節,使得數據tmpString包含無效的地址),但是C中的所有強制轉換都是未選中的,因此您永遠不會得到錯誤。

是的,第二行有未定義的行為。 由於案例是明確的,編譯器只是假設您知道自己在做什么。 實質上,第二個轉換將指針值的第一個字節解釋為字符代碼。 最后一句只是說明性的 - 你甚至不能完全依賴於那種情況。

假設tmpString類型為char * ,那么第二行應該是約束違規,至少在最新標准下

6.5.16.1簡單分配

約束

1以下之一應保留: 112) - 左操作數具有原子,合格或不合格的算術類型,右邊具有算術類型;

- 左操作數具有與右側類型兼容的結構或聯合類型的原子,限定或不合格版本;

- 左操作數具有原子,限定或不合格的指針類型,並且(考慮左值操作數在左值轉換后將具有的類型)兩個操作數都是指向兼容類型的限定或不合格版本的指針,並且左邊指向的類型具有所有權利所指出的類型的資格;

- 左操作數具有原子,限定或不等式指針類型,並且(考慮左值操作數在左值轉換后將具有的類型)一個操作數是指向對象類型的指針,另一個是指向限定或不合格版本的指針of void,左邊指出的類型具有右邊所指類型的所有限定條件;

- 左操作數是原子,限定或不帶標記的指針,右邊是空指針常量; 要么

- 左操作數具有原子,合格或不合格的_Bool類型,右邊是指針。

或者我錯過了什么?

暫無
暫無

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

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