【问题标题】:"Invalid type argument of unary '*' " error“一元'*'的类型参数无效”错误
【发布时间】:2020-06-22 11:48:58
【问题描述】:

我正在尝试用节点构建一棵树,但我遇到了指针问题

我想构建一个节点,但是当我尝试时,我的程序抛出了一个错误。

我尝试删除“*”,但它给了我另一个错误并且没有任何意义(返回结构而不是结构的地址!?)但我不知道错误在哪里:

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct node node;

struct node{
    node *leftson;
    node *rightson;
    int val;
};

node * node_create( int value, node *left, node *right){
    malloc(sizeof(node));
    node n = {left, right, value};
    return (*n);
}

系统返回:error: invalid type argument of unary ‘*’ (have ‘node {aka struct node}’) return (*n);

【问题讨论】:

  • 哦,我不确定 malloc 但我知道错误不是来自那里:用“NULL”替换“(*n)”让函数编译
  • "throws me an error" 不是很有帮助吗?什么错误?

标签: c pointers tree


【解决方案1】:

几个问题:

  1. 您有内存泄漏。
  2. 您在其范围之外引用变量。

正确的方法是:

    node * node_create( int value, node *left, node *right){
        node *n = malloc(sizeof(node));

        n->leftson = left;
        n->rigthson = right;
        n->val = value;

        return n;
    }

使用完成后释放内存,并在malloc之后添加内存检查。

【讨论】:

    【解决方案2】:

    一元 * 运算符应用于指针以取消引用它,即获取它指向的对象。但是n 不是指针,它是struct node 对象的一个​​实例,所以你不能对它应用*

    另外,你不会对malloc的返回值做任何事情,所以它所做的只是泄漏内存。

    您要做的是将n 声明为指向struct node 的指针,将分配的内存分配给该指针,设置指向结构中的值,然后返回指针。

    node * node_create( int value, node *left, node *right){
        node *n = malloc(sizeof(node));
        n->value = value;
        n->leftson = left;
        n->rightson = right;
        return n;
    }
    

    【讨论】:

    • 我认为建议 OP 从书开始会更好。无法通过猜测和论坛帖子来学习语言
    【解决方案3】:

    malloc(sizeof(node));

    malloc 尝试分配内存并返回指向该内存的指针。上面的语句对该返回值没有任何作用。您需要将malloc 的结果分配给一个变量,就像node *p = malloc(sizeof *p); 一样。

    node n = {left, right, value};

    这会创建一个名为n 的本地自动对象,这不是您想要的。函数node_create被定义为返回一个指向node的指针,所以你需要返回一个指向调用者可以使用的对象的指针,而自动对象不适合这样做(因为它的内存保留在函数返回)。

    相反,在分配内存并将其地址分配给p 后,如上所示,用期望值填充p 处的对象。您可以使用:

    p->leftson  = left;
    p->rightson = right;
    p->value    = value;
    

    return (*n);

    *n 如果n 是节点而不是指针,则没有任何意义。而且,如果n 是一个指针,那么*n 就是它指向的结构。但是node_create 被定义为返回一个指针,而不是一个结构。所以你想返回一个指针。

    在上面的代码之后,您可以使用return p;返回所需的指针。

    【讨论】:

      【解决方案4】:

      函数node_create 的返回类型为node *

      node * node_create( int value, node *left, node *right){
      

      这意味着函数需要返回一个指针。

      变量n 声明为

      node n = {left, right, value};
      

      不是指针。它的类型为struct node。所以对没有指针类型的对象应用一元间接运算符*

      return (*n);
      

      没有意义。

      你可以使用地址操作符&amp; like

      return (&n);
      

      从函数返回一个指针。但是在这种情况下,返回的指针将是无效的,因为指向的局部变量n在退出函数后将不再存在。

      你需要的是动态分配一个结构节点类型的对象。而你正在这样做。但是,您没有将调用 malloc 的返回值分配给任何变量,也没有从函数中返回它。

      malloc(sizeof(node));
      

      所以函数中存在内存泄漏。分配的内存地址丢失,无法释放内存。

      您需要的是以下内容

      node * node_create( int value, node *left, node *right)
      {
          node *n = malloc(sizeof(node));
      
          if ( n != NULL )
          {
              n->leftson  = left;
              n->rightson = right;
              n->val      = value;
          }
      
          return n;
      }
      

      请注意,在将参数分配给已分配对象的数据成员之前,您必须检查对象是否分配成功。

          if ( n != NULL )
      

      当函数具有指向结构节点的类型指针的一个参数时,您还可以考虑另一种函数定义。例如

      node * node_create( node *init )
      {
          node *n = malloc(sizeof(node));
      
          if ( n != NULL )
          {
              *n = *init;
          }
      
          return n;
      }
      

      要调用此函数,您应该将所有值“打包”到结构类型的对象中,例如

      node { NULL, NULL, 10 };
      node *new_node = node_create( &n );
      

      【讨论】:

        猜你喜欢
        • 2014-05-19
        • 2018-01-20
        • 1970-01-01
        • 1970-01-01
        • 2021-04-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多