![](/img/trans.png)
[英]Why does the compiler complain when I do not cast the result of malloc?
[英]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返回的指針轉換為單個字符。 由於多種原因,這很糟糕:
我認為警告級別設置得足夠高的編譯器應警告第二次分配。
第二行是錯誤的(轉換為char
會將指針截斷為只有一個字節,使得數據tmpString
包含無效的地址),但是C中的所有強制轉換都是未選中的,因此您永遠不會得到錯誤。
是的,第二行有未定義的行為。 由於案例是明確的,編譯器只是假設您知道自己在做什么。 實質上,第二個轉換將指針值的第一個字節解釋為字符代碼。 最后一句只是說明性的 - 你甚至不能完全依賴於那種情況。
假設tmpString
類型為char *
,那么第二行應該是約束違規,至少在最新標准下 :
6.5.16.1簡單分配
約束
1以下之一應保留: 112) - 左操作數具有原子,合格或不合格的算術類型,右邊具有算術類型;
- 左操作數具有與右側類型兼容的結構或聯合類型的原子,限定或不合格版本;
- 左操作數具有原子,限定或不合格的指針類型,並且(考慮左值操作數在左值轉換后將具有的類型)兩個操作數都是指向兼容類型的限定或不合格版本的指針,並且左邊指向的類型具有所有權利所指出的類型的資格;
- 左操作數具有原子,限定或不等式指針類型,並且(考慮左值操作數在左值轉換后將具有的類型)一個操作數是指向對象類型的指針,另一個是指向限定或不合格版本的指針of void,左邊指出的類型具有右邊所指類型的所有限定條件;
- 左操作數是原子,限定或不帶標記的指針,右邊是空指針常量; 要么
- 左操作數具有原子,合格或不合格的_Bool類型,右邊是指針。
或者我錯過了什么?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.