![](/img/trans.png)
[英]C: typecasting function pointers from generic input arg (void*) into specific (char*/int *) arg and/or different return types, void, int
[英]C Guarantees Re: Pointers to Void and Character Types, Typecasting
我對 C 規范(主要是 C99)的最大努力閱讀使我認為在以下任何類型之間進行強制轉換(或隱式轉換,其中void *
的隱式轉換行為適用)是有效的:
void *
, char *
, 有signed char *
, unsigned char *
我希望這不會觸發未定義的行為,並且保證這些指針具有相同的底層表示。
因此,應該可以采用已經指向可以合法解除引用的地址的四種類型之一的指針,類型轉換和/或將其分配給三個 char 類型指針之一,並解除引用它以訪問相同的內存,唯一的區別是您的代碼是否將該位置的數據視為char
、 signed char
或unsigned char
。
這樣對嗎? 是否有任何版本的 C 標准(在預標准化 C 中缺少void *
類型),這不是真的?
PS我相信這個問題是在傳遞許多其他問題時得到零碎回答的,但我從未見過明確說明/確認的明確答案。
因此,應該可以采用已經指向可以合法解除引用的地址的四種類型之一的指針,類型轉換和/或將其分配給三個 char 類型指針之一,並解除引用它以訪問相同的內存,唯一的區別是您的代碼是否將該位置的數據視為字符、有符號字符或無符號字符。
這是對的。 實際上,您可以使用指向任何類型對象的有效指針並將其轉換為這三個對象中的一些並訪問內存。
您正確地提到了關於void *
和char *
等具有相同表示和對齊要求的規定,但這實際上並不重要。 那是指指針本身的屬性,而不是所指向對象的屬性。
嚴格的別名規則沒有被違反,因為它包含一個明確的規定,即可以使用字符類型讀取或寫入任何對象。
請注意,如果我們有,例如, signed char ch = -2;
,或任何其他負值,則(unsigned char)ch
可能與*(unsigned char *)&ch
。 在具有 8 位字符的系統上,前者保證為254
但后者可能為254
、 253
或130
具體取決於使用的編號系統。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.