Pointers 在链表元素中强制转换指针-为什么?

Pointers 在链表元素中强制转换指针-为什么?,pointers,casting,struct,Pointers,Casting,Struct,假设我有以下结构: typedef struct elementT { int value; struct element *next; } element; 这样做的区别是什么: element *newElem; newElem = malloc(sizeof(element)) 这样做: element *newElem; newElem = (element *) malloc(sizeof(element)) 在我看来,在第一种情况下,我们正在做: 元素*newElem-

假设我有以下结构:

typedef struct elementT {
  int value;
  struct element *next;
} element;
这样做的区别是什么:

element *newElem;
newElem = malloc(sizeof(element))
这样做:

element *newElem;
newElem = (element *) malloc(sizeof(element))
在我看来,在第一种情况下,我们正在做:

元素*newElem->为包含元素类型的地址创建指针。
newElem=malloc(sizeof(element))
->使指针指向malloc的结果

为什么我们需要做(元素*),或者为什么它有用


感谢

它来自旧式C,其中实际上不允许使用
void*
,因此所有内容都返回
char*
,这将导致编译器生成一条警告,指出您正在分配不兼容的指针类型,强制转换只是消除此警告的一种方法。较新的编译器知道您要做什么,并使强制转换变得不必要(除非在某些情况下,例如Linux内核vmalloc函数)。

它来自旧式C,在旧式C中,
void*
实际上不被允许,因此所有内容都返回
char*
,这将导致编译器生成一条警告,指出您正在分配不兼容的指针类型,而强制转换只是消除此警告的一种方法。较新的编译器知道您要做什么,并且不需要强制转换(除非在某些情况下,例如Linux内核vmalloc函数)。

为什么我们甚至需要void*?malloc不是在返回地址吗?@HommerSmith是的,但问题是地址是键入的。这意味着对地址的解引用知道如何解释该数据。Void*只是说这只是一个地址,这是char*没有的概念,因为char*说,这是一个包含一个字节或一系列字节的地址。为什么我们甚至需要Void*?malloc不是在返回地址吗?@HommerSmith是的,但问题是地址是键入的。这意味着对地址的解引用知道如何解释该数据。Void*简单地说这只是一个地址,这是char*没有的概念,因为char*说,这是一个包含一个字节或一系列字节的地址。