在C中使用malloc为typedef类型分配空间

我不确定我需要使用什么作为malloc的参数来在table_allocate(int)函数中分配空间。 我只想到count_table * cTable = malloc(sizeof(count_table *)),但这对size参数没有任何作用。 我应该为list_node_t分配空间吗? 以下是我正在使用的内容。

在.h文件中我给了这个签名:

 //创建一个count表结构并为其分配空间                         
 //将其作为指针返回                                                        
 count_table_t * table_allocate(int);

以下是我应该使用的结构:

 typedef struct list_node list_node_t;

 struct list_node {
   char * key;
   int值;

   //列表中的下一个节点                                                   
   list_node_t * next;
 };

 typedef struct count_table count_table_t;

 struct count_table {
   int size;
   //一个list_node指针数组                                              
   list_node_t ** list_array;
 };

谢谢!

 count_table * cTable = malloc(sizeof(count_table *))

是错的。 它应该是

 count_table* cTable = malloc(sizeof(count_table)); 

此外,您还必须单独为list_node_t分配内存。

编辑:

除了Clifford指出的为列表节点分配内存之外,我认为内存分配也应该注意列表节点内的char *key

你的建议: count_table* cTable = malloc(sizeof(count_table*))只会为指向 count_table的指针分配空间。

你需要

 count_table* cTable = malloc(sizeof(count_table) ) ; 

每个列表节点将被单独分配,并且cTable-> size和cTable-> list_array以及最后一个list_node_t::next更新。 维护指向最后添加的节点的指针可以更快地添加节点。

我不确定为什么count_table::list_array的类型为list_node_t**而不仅仅是list_node_t* (同样称为list_array而不仅仅是list )。 你的意图是它同时是一个数组和一个列表吗? 这有点多余。 该成员只需要是指向第一个节点的指针,然后通过list_node::next访问连续的节点

鉴于int是创建的count_table_t的“size”参数,看起来您应该同时分配count_table_t本身,以及初始化其成员。

初始化list_array成员还涉及内存分配,因此它看起来像:

 count_table_t *table_allocate(int size) { count_table_t *table = malloc(sizeof *table); int i; table->size = size; table->list_array = malloc(size * sizeof table->list_array[0]); for (i = 0; i < size; i++) table->list_array[i] = NULL; return table; } 

但是,您还需要检查一些错误情况: sizeof table->list_array[0]的乘法可能会溢出,并且malloc()调用之一可能会失败。 所以函数应该看起来像这样:

 count_table_t *table_allocate(int size) { count_table_t *table; int i; /* Check for overflow in list allocation size */ if (size < 0 || size > (size_t)-1 / sizeof table->list_array[0]) return NULL; table = malloc(sizeof *table); if (table == NULL) return NULL; table->size = size; table->list_array = malloc(size * sizeof table->list_array[0]); if (table->list_array == NULL) { free(table); return NULL; } for (i = 0; i < size; i++) table->list_array[i] = NULL; return table; } 

(注意, (size_t)-1是一个常量,它等于size_t最大值size_tmalloc()的参数类型。

除了其他海报,他们指出你只为指针分配足够的空间,而不是你想要的数据所占据的空间,我强烈建议你做这样的事情:

 count_table* cTable = malloc(sizeof(*cTable)); 

如果cTable的类型发生变化,这将有助于您,您不必将两个部分调整到该行,只需要调整类型。