我不确定我需要使用什么作为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;
};
谢谢!
4 回答
是错的 . 它应该是
此外,您还必须单独为list_node_t分配内存 .
编辑:
除了Clifford指出的为列表节点分配内存之外,我认为内存分配也应该关注列表节点内部的
char *key
.您的建议:
count_table* cTable = malloc(sizeof(count_table*))
只会为指向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
成员还涉及内存分配,因此它看起来像:但是,您还需要检查一些错误情况:
size
乘以sizeof table->list_array[0]
可能会溢出,并且malloc()
中的任何一个调用都可能失败 . 所以函数应该看起来像这样:(注意
(size_t)-1
是一个常量,等于size_t
的最大值,这是malloc()
的参数类型) .除了其他海报,他们指出你只为指针分配足够的空间,而不是你想要的数据所占据的空间,我强烈建议你做这样的事情:
如果
cTable
的类型发生变化,这将有助于您,您不必将两个部分调整到该行,只需要调整类型 .