struct node* new_node =
(struct node*) malloc(sizeof(struct node));
我不明白这里的*:...(struct node*) malloc(siz...
首先,* 属于node 还是malloc?这是什么意思?指针与内存函数 malloc 有什么关系?我真的对 * 位置感到困惑
谢谢
C 中括号中的类型名称(例如(struct node *)
)称为“强制转换”。这是一种将表达式类型更改为命名类型的方法,通常与指针一起使用。
但是,这是忽略Do I cast the result of malloc中的建议的代码。这里不需要演员表,这(在我看来,如果您遵循该链接,也许并不奇怪)相当糟糕的代码。
编写此分配的最佳方法是:
struct node * new_node = malloc(sizeof *new_node);
这只提到了一次类型,放弃了可能引入错误并且阅读起来既无意义又麻烦的强制转换,并避免在指定要分配多少内存时引入脆弱性。赢了,赢了。
struct node <= type
*new_node <= pointer named new_node (of type struct node)
= <= assignment
(struct node *) <= cast to pointer of type struct node
malloc(SIZE) <= returns pointer of type void, thus needs cast
(struct node*)
是cast,这是一种显式类型转换。*
属于struct node
,说明请求的类型是指向变量的指针struct node
。malloc() 总是返回void*
一个 void 指针。
malloc 的函数定义是void* malloc (size_t size);
(在这种情况下也是*
属于的void
)。
编写您问题中发布的代码的人将此 void 指针转换为struct node*
. 他们为什么这样做尚不清楚,他们要么对 C 中的指针转换如何工作感到困惑,而且也不知道这种转换的危险,要么代码是为 C++ 编写的。
C 语言中的 void 指针是一种通用指针类型,可以转换为任何其他指针类型,无需强制转换 (1)。
但是,在 C++ 中,转换 void 指针时必须始终进行强制转换,因为 C++ 具有比 C 更严格的类型转换规则并强制执行显式转换。
在 C 中强制转换 malloc() 的结果是危险的,并且被认为是一个错误 (2),因为除非通过 #include 提供正确的函数原型,否则编译器默认行为会启动,它会错误地认为 malloc 返回 int。根据特定系统的指针和整数宽度,它可能工作得很好,或者可能导致程序崩溃和/或内存泄漏。
然而,在 C++ 中强制转换 malloc() 的结果是必要的。
参考:
是*
用于类型。这里的类型是 a struct node*
(指向 a 的指针struct node
)。
它不是“连接”到malloc
功能,而是“连接”到类型。malloc()
返回一个指针,因此您也将返回值分配为一个指针。
这只是一个类型转换。实际上 malloc 函数返回 void pointer (void *) ,这意味着它不特定于任何数据结构或数据类型。它返回一个通用指针。通过类型转换,我们使返回值具体化,在这种情况下, (struct node *) 是指向结构节点类型的指针。
简单来说,我们可以说我们正在将 void 指针 (void *) 转换为 struct 指针 (struct node *)。