铸造void指针

我在旧的C代码中看到了很多以下内容:

type_t *x = (type_t *) malloc(...);

从malloc()返回的指针,由于void *是什么意思?是因为较旧的C编译器不支持void指针,而malloc()用于返回char *?

你自己的解释是正确的.前ANSI C(‘K& R’C)没有隐式转换的void *类型. char *作为伪void *类型加倍,但是您需要显式转换类型转换.

在现代C中,铸造被皱眉,因为它可以抑制malloc的缺失原型的编译器警告.在C中,需要转换(但是您应该在大多数情况下使用新的而不是malloc).

更新

下面我的意见,试图解释为什么要求演员有点不清楚,我会尝试在这里更好地解释.您可能会认为,即使malloc返回char *,也不需要转换,因为它类似于:

int  *a;
char *b = a;

但在这个例子中,还需要一个演员.第二行是简单赋值运算符(C99 6.5.1.6.1)的约束违规.两个指针操作数都需要兼容类型.当您更改为:

int  *a;
char *b = (char *) a;

约束违反消失(两个操作数现在都有类型char *),结果定义良好(用于转换为char指针).在“相反的情况”中:

char *c;
int  *d = (int *) c;

对于cast来说,相同的参数保持不变,但是当int *具有比char *更严格的对齐要求时,结果就是定义了实现.

结论:在ANSI之前,类型转换是必要的,因为malloc返回char *,而不是转换结果是’=’运算符的约束违反.

http://stackoverflow.com/questions/3559656/casting-void-pointers

转载注明原文:铸造void指针