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
一样。
答案 0 :(得分:6)
6.5表达式
[...]
6访问其存储值的对象的有效类型是声明的类型 object,如果有的话.87)如果一个值存储到一个没有声明类型的对象中 lvalue的类型不是字符类型,那么左值的类型就变成了 该访问的对象的有效类型以及不修改的后续访问 储存的价值。如果将值复制到没有使用声明类型的对象中 memcpy或memmove,或者被复制为字符类型数组,然后是有效类型 用于该访问的修改对象以及不修改该访问的后续访问 value是从中复制值的对象的有效类型(如果有)。对于 对没有声明类型的对象的所有其他访问,对象的有效类型是 只是用于访问的左值的类型 7 对象的存储值只能由具有其中一个的左值表达式访问 以下类型:88)
- 与对象的有效类型兼容的类型
- 与对象的有效类型兼容的类型的限定版本,
- 对应于有效类型的有符号或无符号类型的类型 对象,
- 对应于合格版本的有符号或无符号类型的类型 有效的对象类型,
- 聚合或联合类型,其中包含上述类型之一 成员(包括,递归地,子集合或包含的联合的成员),或
- 字符类型。
强调我的。因此,您可以将任何类型视为一个字符数组(unsigned char[]
,char[]
或signed char[]
)。
我还引用了第6段,因为它反过来不适用。