结构数组:从不兼容的指针类型分配

时间:2014-04-01 20:51:11

标签: c pointers struct

对于太具体的问题我感到抱歉,但是我的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

2 个答案:

答案 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是一个运算符,而不是一个函数;仅当操作数是类型名称intfloatstruct 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那么它仍然可以正常工作并且不会泄漏内存。