取消引用void指针

时间:2015-07-28 06:05:08

标签: c pointers

我有以下代码:

#include <inttypes.h>
#include <stdlib.h>
struct a
{
  void *p;
};

int main(void)
{
  struct a *ptr = malloc(sizeof(struct a));
  ptr->p = malloc(sizeof(uint8_t));
  *((uint8_t *) ptr->p) = 2;
  return 0;
}

我在解除引用之前转换void指针以避免警告

  

警告:取消引用'void *'指针

我是通过这样做打破任何规则还是这个代码好?

2 个答案:

答案 0 :(得分:6)

是的,此代码是合法的,不会导致未定义的行为(除非malloc返回NULL)。

答案 1 :(得分:3)

根据标准规定,此代码看起来不错。指向字符类型的指针可用于指向对象而不会破坏别名规则。

引用标准,章节§6.3.2.3

  

[...]。当指向对象的指针转换为指向字符类型的指针时,结果指向对象的最低寻址字节。结果的连续增量,直到对象的大小,产生指向对象剩余字节的指针。