对于太具体的问题我感到抱歉,但是我的Py背景对指针特技来说非常困难。
的被修改 的
我想声明一个结构数组:
struct key {
int* data;
struct node* left;
struct node* right;
};
//There is a problem too. Is it possible to return an array of structs from a function.
struct key *NewNode(int value) {
struct key** new_node;
struct key* new_key;
new_node = (struct key*)malloc(sizeof(new_key)); // warning is here
new_key = malloc(sizeof *new_key);
new_key->data = value;
new_key->left = NULL;
new_key->right = NULL;
new_node[0] = new_key;
return new_node;
}
// Somewhere in further code:
realloc(new_node, sizeof *key);
new_node[1] = new_key; // Next key passed to the node.
如何在没有此警告的情况下声明结构数组?
从不兼容的指针类型分配
请告诉我,为什么会这样?因为我仍然认为数组成员的类型是struct key
。
答案 0 :(得分:2)
这里有几个问题。
首先,我假设此代码的目的是分配和初始化struct node
类型的单个对象;因此,new_node
是多余的;它没有任何意义。完全摆脱它并直接返回new_key
。
其次,
new_key = malloc(sizeof(new_key));
不会分配足够的内存来存储struct node
类型的对象;它只分配足够的空间来存储指针到struct node
,因为表达式 new_key
的类型是struct node *
。您想要将该行更改为
new_key = malloc( sizeof *new_key );
请注意sizeof
是一个运算符,而不是一个函数;仅当操作数是类型名称int
或float
或struct whatchamacallit
时才需要填充。
最后,行
new_key->data = value;
是一面红旗;根据您调用NewNode
的方式,此指针可能会对所有节点都相同。如果您的来电者看起来像:
while ( not_done_yet )
{
x = get_input();
node = NewNode( &x );
root = insert( root, node );
}
树中节点的所有将最终指向同一个事物(x
)。更糟糕的是,如果x
超出范围,那么突然所有这些指针都会变成无效。
如果您的节点要存储单个整数值,那么最好同时使参数和data
成员定期int
,而不是指向{{1 }}。
汇总:
int
修改强>
如果要创建节点数组,请在调用struct node {
int data;
struct node* left;
struct node* right;
};
struct node *NewNode(int value)
{
struct node* new_key = malloc(sizeof *new_key);
if ( new_key )
{
new_key->data = value;
new_key->left = NULL;
new_key->right = NULL;
}
return new_key;
}
的函数中执行此操作,而不是在NewNode
函数本身中执行此操作:
NewNode
这段代码对你如何构建单个节点做了一些假设,但它应该说明我想要做的事情,这就是你想要干净地分开构建节点数组来构建一个节点。单节点。
答案 1 :(得分:1)
警告来自你的虚假演员。删除它,你不应该转换malloc返回的值。
此外,你在行之后的行中将错误的字节数malloc到new_key
。
您可以通过使用此习语来避免这两个错误:
new_node = malloc( sizeof *new_node );
new_key = malloc( sizeof *new_key );
您的功能也有内存泄漏。您返回new_node[0]
,泄漏内存new_node
。我不确定你要做什么(我希望一个名为"新节点"的函数会返回一个新的struct node
);但是如果你从函数中完全删除new_node
那么它仍然可以正常工作并且不会泄漏内存。