我不知道到底要用什么来作为论据,才能 malloc
中分配空间。table_allocate(int)
功能。我只是在想 count_table* cTable = malloc(sizeof(count_table*))
但这对大小参数没有任何作用。 我是否应该为 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);
这里是我应该使用的结构。 Here are the structs that I'm supposed to use:
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;
};
count_table* cTable = malloc(sizeof(count_table*)),但那......。
是错误的。它应该是
count_table* cTable = malloc(sizeof(count_table));
另外,你也必须为list_node_t单独分配内存。
EDIT.Clifford指出,除了为list节点分配内存外,我认为还应该为list_node_t单独分配内存。
除了Clifford指出的为list节点分配内存的问题之外, 我认为也应该为list_node_t分配内存。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
貌似你应该是同时分配了 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()
).
除了其他发帖者指出你只为指针分配了足够的空间,而不是你想要的数据将占据的空间之外,我强烈建议你做这样的事情。
count_table* cTable = malloc(sizeof(*cTable));
这将会帮助你,以防万一... cTable
变化,你就不必调整这一行的两个部分,只需调整类型。