我不确定我需要使用什么作为malloc的参数来在table_allocate(int)函数中分配空间。我只想到count_table * cTable = malloc(sizeof(count_table *)),但这对size参数没有任何作用。我应该为list_node_t分配空间吗?以下是我正在使用的内容。
在.h文件中我给出了这个签名:
//create a count table struct and allocate space for it //return it as a pointer count_table_t* table_allocate(int);
以下是我应该使用的结构:
typedef struct list_node list_node_t; struct list_node { char *key; int value; //the next node in the list list_node_t *next; }; typedef struct count_table count_table_t; struct count_table { int size; //an array of list_node pointers list_node_t **list_array; };
谢谢!
答案 0 :(得分:7)
count_table* cTable = malloc(sizeof(count_table*))
错了。它应该是
count_table* cTable = malloc(sizeof(count_table));
此外,您还必须单独为list_node_t分配内存。
编辑:
除了Clifford指出的为列表节点分配内存之外,我认为内存分配也应该关注列表节点内的char *key
。
答案 1 :(得分:2)
您的建议: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
答案 2 :(得分:2)
鉴于int
是创建的count_table_t
的“大小”参数,看起来您应该同时分配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;
}
但是,您还需要检查一些错误情况:size
乘以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
的最大值,它是malloc()
的参数类型。 / p>
答案 3 :(得分:1)
除了其他海报,他们指出你只为指针分配足够的空间,而不是你想要的数据所占据的空间,我强烈建议你做这样的事情:
count_table* cTable = malloc(sizeof(*cTable));
如果cTable
的类型发生变化,这将有助于您,您不必将两个部分调整到该行,只需要调整类型。