我在旧的C代码中看到了很多下面这样的写法:
type_t *x = (type_t *) malloc(...);
malloc()
返回的是 void *
类型的指针,为什么还要进行指针类型转换?这是因为旧版本的 C 编译器不支持 void 指针,所以 malloc()
曾经返回 char *
指针。
我在旧的C代码中看到了很多下面这样的写法:
type_t *x = (type_t *) malloc(...);
malloc()
返回的是 void *
类型的指针,为什么还要进行指针类型转换?这是因为旧版本的 C 编译器不支持 void 指针,所以 malloc()
曾经返回 char *
指针。
void *
类型。 char *
作为一种伪 void *
类型,但需要使用显式的类型转换。malloc
缺少原型的编译器警告。在 C++ 中,强制类型转换是必需的(但大多数时候应该使用 new
而不是 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;
对于类型转换来说,同样的论点也成立,但是当int *
具有比char *
更严格的对齐要求时,结果是实现定义。
结论:在ANSI之前的时代,类型转换是必需的,因为malloc
返回的是char *
,而不对转换结果进行强制转换将违反'='运算符的约束条件。
x = c
根本不需要编译-它违反了标准中的“应该”条款。编译器拒绝它并将其视为错误而不仅仅是发出警告是合理的。 - caf我不知道malloc曾经返回过char*。
但是,从void*到type_t*(或任何其他类型)的隐式转换并不总是被允许的。因此,需要显式地将其转换为正确的类型。
char *
类型。由于需要一个“通用”的指针类型可以隐式地转换为任何其他指针类型,因此在 C89 中引入了 void *
类型。自 C89 以来,没有必要显式地将 malloc() 函数的结果强制转换为所需的指针类型。 - John Bodevoid*
类型会自动转换为相应的 type_t*
类型。 - sth(type)
操作符。在指针被使用之前确实需要进行转换,但是这种转换会隐式地发生。-1表示错误使用了“cast”这个词。 - R.. GitHub STOP HELPING ICE
void*
。C语言并非C++。 - Joey Adams