【问题标题】:Brackets containing a datatype on right hand side of assignment operator赋值运算符右侧包含数据类型的括号
【发布时间】:2021-12-07 12:11:47
【问题描述】:

我试图理解为什么我有时会在 C 中的赋值运算符右侧看到包含数据类型的括号。

具体来说,我试图实现一个链表,因为我还是 C 的新手,所以我使用 this 来指导我。

我遇到了这条线:struct node* link = (struct node*) malloc(sizeof(struct node));

它是instertFirst 函数的一部分,我猜它会在链表的头部添加一个新项目。

根据我目前的理解将这一行分解为:创建一个名为linkstruct node 指针,该指针指向一个新分配的内存块,该内存块的大小与node 结构的大小相同。

那么 (struct node*) 的目的到底是什么?我最好的猜测是它为新分配的内存块赋予了一种类型......?

【问题讨论】:

  • 这是一个类型转换。
  • 它与malloc() 是多余的,因为它返回void *,可以将其转换为任何其他指针类型而无需强制转换。但总的来说,(typename) 将值从一种类型转换为另一种类型。

标签: c pointers singly-linked-list implicit-conversion void-pointers


【解决方案1】:

函数malloc返回一个void *类型的指针,与分配内存的对象无关。

在 C 中,void * 类型的指针可以分配给任何其他对象类型的指针。

所以你可以写

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

在 C++ 中,这种隐式转换是被禁止的。您需要将返回的 void * 类型的指针显式转换为 struct node * 类型,如

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

在上面提到的 C 中,这样的强制转换是多余的,有时只用于代码的自我记录。

【讨论】:

    猜你喜欢
    • 2016-06-08
    • 2023-04-10
    • 1970-01-01
    • 2016-02-01
    • 2021-01-13
    • 2015-06-12
    • 2015-07-16
    相关资源
    最近更新 更多