【问题标题】:How does struct Node *ptr = malloc(sizeof(*ptr)) work?struct Node *ptr = malloc(sizeof(*ptr)) 如何工作?
【发布时间】:2021-12-26 16:58:02
【问题描述】:

我是 C 初学者,在尝试实现链表时遇到了这段代码。

    struct Node *ptr = malloc(sizeof(*ptr));

Node 结构如下所示:

    struct Node {
        int data;
        struct Node *next;
    };

我试图理解第一行。似乎malloc(sizeof(*ptr)) 已经知道ptr 的内容。左侧到底发生了什么,是在调用 malloc 之前发生的吗?

【问题讨论】:

  • 如果你按照指针的方式来执行它是有道理的——它的意思是“给我空间来存放结构节点大小的东西”。如果你 make 是这样的自我参照,它显然更安全。我认为这是一种愚蠢的写法,因为它不是很清楚。每个人都知道我们想要结构节点的大小,所以我只写了结构节点,但我想这就是它的完成方式。
  • @LEF 这样写可以防止类型名称改变。
  • malloc 返回 void*,我认为它不起作用。您应该将其转换为 Node* 类型。
  • @ĐăngKhôi C 允许在没有演员表的情况下与void * 相互转换。 C++ 没有。
  • @dbush 您可以使用malloc(sizeof(struct Node)) 防止更改变量名的类似参数。

标签: c pointers malloc sizeof


【解决方案1】:

好像malloc(sizeof(*ptr))已经知道ptr的内容了。

其实不然。 sizeof 运算符实际上并不计算它的操作数(除非它是一个可变长度数组),它只是查看它的类型。这意味着 ptr 实际上并没有被取消引用,因此是一个安全的操作。

【讨论】:

    【解决方案2】:

    如果您想知道 type 的大小,请仅使用带有 sizeof 的括号。如果你有一个表达式,比如*ptr,写就够了:

    struct Node *ptr = malloc(sizeof *ptr);         // <- no parenthesis
    

    表达式*ptr 取消引用指针,使其变为struct Node,这就是sizeof 返回大小的原因。

    sizeofexpression - 返回表达式类型的对象表示的大小(以字节为单位)。没有对表达式应用隐式转换。

    如果你这样做,你得到的大小是一样的:

    struct Node *ptr = malloc(sizeof(struct Node)); // <- parenthesis needed
    

    但为了清晰起见,第一种选择通常更可取。

    【讨论】:

      【解决方案3】:

      您需要为声明为struct Node 类型的对象分配内存

      struct Node {
          int data;
          struct Node *next;
      };
      

      所以在 malloc 的调用中,你需要指定要为这种类型的对象分配的内存大小。 malloc 函数返回一个指向已分配内存的指针。

      所以你可以写

      struct Node *ptr = malloc( sizeof( struct Node ) );
      

      另一方面,表达式*ptr 具有结构节点类型。也就是说,声明的指针ptr 具有指针类型struct Node *,并且取消引用像*ptr 这样的指针会产生struct Node 类型的表达式。

      所以你也可以重写上面的记录

      struct Node *ptr = malloc(sizeof(*ptr));
      

      因为在这种情况下sizeof( struct Node ) 等价于sizeof( *ptr )

      即编译器需要知道运算符sizeof的操作数的类型,以确定该类型对象的大小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-15
        • 2020-09-07
        • 2021-11-11
        • 2019-11-23
        • 2021-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多