我正在尝试构建一个带有节点的树,但我有一个指针问题
我想构建一个节点,但是当我尝试时,我的程序会给我一个错误。
我尝试删除"*",但它给了我另一个错误并且没有意义(返回结构而不是结构的地址!?(,但我不知道错误在哪里:
这是我的代码:
#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);
几个问题:
- 您有内存泄漏。
- 您正在引用变量超出其范围。
正确的方法是:
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 );