3
struct node* new_node =
            (struct node*) malloc(sizeof(struct node));

我不明白这里的*:...(struct node*) malloc(siz... 首先,* 属于node 还是malloc?这是什么意思?指针与内存函数 malloc 有什么关系?我真的对 * 位置感到困惑

谢谢

4

6 回答 6

6

C 中括号中的类型名称(例如(struct node *))称为“强制转换”。这是一种将表达式类型更改为命名类型的方法,通常与指针一起使用。

但是,这是忽略Do I cast the result of malloc中的建议的代码。这里不需要演员表,这(在我看来,如果您遵循该链接,也许并不奇怪)相当糟糕的代码。

编写此分配的最佳方法是:

struct node * new_node = malloc(sizeof *new_node);

这只提到了一次类型,放弃了可能引入错误并且阅读起来既无意义又麻烦的强制转换,并避免在指定要分配多少内存时引入脆弱性。赢了,赢了。

于 2012-08-22T08:14:06.830 回答
2
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
于 2012-08-22T07:57:40.607 回答
1

(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() 的结果是必要的。


参考:

  1. ISO 9899:2011 6.3.2.3/1。
  2. 具体来说,强制转换 malloc 的结果有什么危险?
于 2012-08-22T08:39:32.020 回答
0

*用于类型。这里的类型是 a struct node*(指向 a 的指针struct node)。

它不是“连接”到malloc功能,而是“连接”到类型。malloc()返回一个指针,因此您也将返回值分配为一个指针。

于 2012-08-22T07:57:19.217 回答
0

它只是类型转换

malloc返回一个void指针(没有任何类型的指针)。 (struct node *)意味着您正在为malloc. 也看到这个

于 2012-08-22T08:51:49.007 回答
0

这只是一个类型转换。实际上 malloc 函数返回 void pointer (void *) ,这意味着它不特定于任何数据结构或数据类型。它返回一个通用指针。通过类型转换,我们使返回值具体化,在这种情况下, (struct node *) 是指向结构节点类型的指针。

简单来说,我们可以说我们正在将 void 指针 (void *) 转换为 struct 指针 (struct node *)。

于 2012-08-22T09:12:46.063 回答