是否允许从TYPE *转换为unsigned char *?

时间:2014-07-13 21:01:15

标签: c void-pointers opaque-pointers

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一样。

1 个答案:

答案 0 :(得分:6)

  

6.5表达式

     

[...]
  6访问其存储值的对象的有效类型是声明的类型   object,如果有的话.87)如果一个值存储到一个没有声明类型的对象中   lvalue的类型不是字符类型,那么左值的类型就变成了   该访问的对象的有效类型以及不修改的后续访问   储存的价值。如果将值复制到没有使用声明类型的对象中   memcpy或memmove,或者被复制为字符类型数组,然后是有效类型   用于该访问的修改对象以及不修改该访问的后续访问   value是从中复制值的对象的有效类型(如果有)。对于   对没有声明类型的对象的所有其他访问,对象的有效类型是   只是用于访问的左值的类型   7 对象的存储值只能由具有其中一个的左值表达式访问   以下类型:88)

     
      
  • 与对象的有效类型兼容的类型
  •   
  • 与对象的有效类型兼容的类型的限定版本,
  •   
  • 对应于有效类型的有符号或无符号类型的类型   对象,
  •   
  • 对应于合格版本的有符号或无符号类型的类型   有效的对象类型,
  •   
  • 聚合或联合类型,其中包含上述类型之一   成员(包括,递归地,子集合或包含的联合的成员),或
  •   
  • 字符类型
  •   

强调我的。因此,您可以将任何类型视为一个字符数组(unsigned char[]char[]signed char[])。

我还引用了第6段,因为它反过来不适用。