C 取消对空指针的引用

C 取消对空指针的引用,c,pointers,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; } #包括 #包括 结构a { v

我有以下代码:

#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;
}
#包括
#包括
结构a
{
void*p;
};
内部主(空)
{
结构a*ptr=malloc(sizeof(结构a));
ptr->p=malloc(sizeof(uint8_t));
*((uint8_t*)ptr->p)=2;
返回0;
}
我在取消引用之前抛出空指针以避免警告

警告:取消引用“void*”指针


我这样做是否违反了任何规则,或者此代码是否良好?

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

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

引用本标准第§6.3.2.3章

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


您对可能被违反的规则有什么怀疑?如果没有具体原因说明
p
的类型不仅仅是
uint8\t*
,这是一个糟糕的代码。@MattMcNabb抛出可修改的左值?只是想确认一下这是好是坏?@Staven先生,这不是我报告中的实际代码。。只是想做点像这样的事。假设狭窄处已经有一个
void*p
,该结构不能受到干扰,但想要使用它。。这不是一个糟糕的代码您应该
#包括
即使代码不是指向字符类型的指针,也可以。由于对象没有声明的类型,因此用于写入的有效类型是您用来写入的类型(用于读取的有效类型是最后写入对象的类型)。我们只在这个例子中写,所以我们设置了有效类型。@mattmcnab绝对是先生。我在想,如果
p
不是一个
void*
,那么也可以转换为
char*
(或等效)并定义进一步的用法,对吗?注:我认为uint8\u t不一定是字符类型()@SouravGhosh
p
的类型无关紧要;对象的类型很重要。对象是由
malloc
创建的,因此它没有类型。@MattMcNabb抱歉,先生,有点困惑。我认为
p
的类型比
void*
更重要。比如,如果我们有
float*p=malloc(sizeof*p)*((int*)p)=5是否定义了这种情况?