【问题标题】:Assigning a pointer in content of a pointer在指针的内容中分配指针
【发布时间】:2020-12-12 01:13:30
【问题描述】:

在代码中,我们可以看到在*new_node 中分配了一个指针。但在C *new_node 中表示new_node 的内容。那么,它的原因是什么?为什么它没有造成任何问题?

Node *create_node(int item, Node *next)
{
    Node *new_node = (Node *)malloc(sizeof(Node));      //isn't it receiving the pointer as content of(*new_node) new_node?
    if (new_node == NULL) {
        printf("Error! Could not crate a new Node\n");
        exit(1);
    }

    new_node->data = item;
    new_node->next = next;
}

【问题讨论】:

  • 等等,你到底遇到了什么问题?你能把小文本改写成没有意义吗?
  • new_node 分配给,而不是 *new_node。从技术上讲,这是一个初始化,与Node *new_node; *new_node = malloc(sizeof(Node)); 不同,没有任何意义。
  • 您是否对使用Node *new_node = ... 而不是Node* new-node = ... 感到困惑?它们的意思是一样的。

标签: c pointers struct linked-list return


【解决方案1】:

在表达式中*new_node 表示“new_node 指向的对象”。但是Node *new_node = (Node *)malloc(sizeof(Node));是声明,不是表达式语句,其中的文本*new_node也不是表达式。

声明的第一部分 Node *new_node 说“new_node 是指向 Node 的指针。”声明的第二部分 = (Node *)malloc(sizeof(Node)) 表示“将 new_node 初始化为 (Node *)malloc(sizeof(Node))。 this 中的= 不是赋值,也不是赋值表达式。它是在声明中使用的语法,用于为正在定义的对象指定初始值。正在定义的对象是new_node,而不是*new_node

这是声明和赋值之间的不同语法,你必须习惯它。 Node *new_node = foo;new_node 初始化为foo,但*new_node = foo;*new_node 设置为foo

【讨论】:

    【解决方案2】:

    Node *new_node = (Node *)malloc(sizeof(Node));

    这会为 Node 结构的新元素分配新的动态内存。而分配内存的基地址存储在new_node中。

    现在,new_node 指向一个新内存,但该内存是空的/垃圾。它不包含有关节点的任何有用信息。因此,我们需要在该结构中填充必要的信息以使其有用。

    `new_node->data = item;`
     new_node->next = next;
    

    这些行将数据复制到新节点分配的内存中,并将新节点与其他节点链接。

    注意:您的代码 sn-p 没有返回语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 2018-07-23
      • 2021-06-22
      • 2015-04-21
      • 1970-01-01
      相关资源
      最近更新 更多