[英]Is casting from TYPE* to unsigned char* allowed?
C99 - 特別是第6.2.6.1節第4段 - 規定允許將對象表示復制到unsigned char數組中:
struct {
int foo;
double bar;
} baz;
unsigned char bytes[sizeof baz];
// Do things with the baz structure.
memcpy(bytes, &baz, sizeof bytes);
// Do things with the bytes array.
我的問題:我們不能通過簡單的轉換避免額外的內存分配和復制操作嗎? 例如:
struct {
int foo;
double bar;
} baz;
unsigned char *bytes = (void *)&baz;
// Do stuff with the baz structure.
// Do things with the bytes array.
當然,需要跟蹤大小,但這首先是合法的,還是屬於實現定義或未定義行為的范圍?
我問,因為我正在實現類似於qsort
的算法,我希望它適用於任何類型的數組,無論類型如何,就像qsort
一樣。
6.5表達式
[...]
6用於訪問其存儲值的對象的有效類型是對象的聲明類型(如果有).87)如果通過具有非字符類型的左值將值存儲到沒有聲明類型的對象中類型,然后左值的類型成為該訪問的對象的有效類型以及不修改存儲值的后續訪問。 如果使用memcpy或memmove將值復制到沒有聲明類型的對象中,或者將其復制為字符類型數組,則該訪問的修改對象的有效類型以及不修改該值的后續訪問的有效類型是復制值的對象的有效類型(如果有)。 對於沒有聲明類型的對象的所有其他訪問,對象的有效類型只是用於訪問的左值的類型。
7 對象的存儲值只能由具有以下類型之一的左值表達式訪問:88)
- 與對象的有效類型兼容的類型,
- 與對象的有效類型兼容的類型的限定版本,
- 與對象的有效類型對應的有符號或無符號類型的類型,
- 與有效類型的對象的限定版本對應的有符號或無符號類型的類型,
- 聚合或聯合類型,包括其成員中的上述類型之一(包括遞歸地,子聚合或包含聯合的成員),或者
- 一個字符類型 。
強調我的。 因此,您可以將任何類型視為字符數組( unsigned char[]
, char[]
或signed char[]
)。
我還引用了第6段,因為它反過來不適用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.