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
does.
6.5 表达式
[...]
6 访问其存储值的对象的有效类型是该对象的声明类型
对象,如果有的话。87) 如果通过一个方法将一个值存储到一个没有声明类型的对象中
左值的类型不是字符类型,则左值的类型变为
该访问和不修改的后续访问的对象的有效类型
存储的值。如果使用将值复制到没有声明类型的对象中
memcpy或者memmove,或者是复制为字符类型数组,则为有效类型
该访问以及不修改对象的后续访问的已修改对象的
value 是从中复制值的对象的有效类型(如果有)。为了
对没有声明类型的对象的所有其他访问,该对象的有效类型是
只是用于访问的左值的类型。
7 对象的存储值只能由具有以下之一的左值表达式访问
以下类型:88)
- 与对象的有效类型兼容的类型,
- 与对象的有效类型兼容的类型的限定版本,
- 与有效类型对应的有符号或无符号类型的类型
目的,
- 与合格版本相对应的有符号或无符号类型的类型
对象的有效类型,
- 聚合或联合类型,其中包括上述类型之一
成员(递归地包括子聚合或包含联合的成员),或
-
字符类型.
强调我的。因此,您可以将任何类型视为字符数组(unsigned char[]
, char[]
or signed char[]
).
我还引用了第 6 段,因为它使得相反的情况不适用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)