我有以下代码:
#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 *'指针
我是通过这样做打破任何规则还是这个代码好?
答案 0 :(得分:6)
是的,此代码是合法的,不会导致未定义的行为(除非malloc
返回NULL
)。
答案 1 :(得分:3)
根据标准规定,此代码看起来不错。指向字符类型的指针可用于指向对象而不会破坏别名规则。
引用标准,章节§6.3.2.3
[...]。当指向对象的指针转换为指向字符类型的指针时,结果指向对象的最低寻址字节。结果的连续增量,直到对象的大小,产生指向对象剩余字节的指针。