C - "Invalid type argument of unary '*' "错误



我正在尝试构建一个带有节点的树,但我有一个指针问题

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

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

这是我的代码:

#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);

几个问题:

  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后添加内存检查。

一元*运算符应用于指针以取消引用它,即获取它指向的对象。 但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;
}

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;的所需指针。

函数node_create的返回类型为node *

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

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

声明的变量n

node n = {left, right, value};

不是指针。它具有类型struct node.因此,对没有指针类型的对象应用一元间接寻址运算符*

return (*n);

没有意义。

您可以使用地址运算符&例如

return (&n);

从函数返回指针。但在这种情况下,返回的指针将是无效的,因为指向的局部变量n在退出函数后将不处于活动状态。

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

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 );

相关内容

最新更新