2010-11-23 63 views
2

我不确定我需要用作malloc的参数来分配table_allocate(int)函数中的空间。我只是想count_table * cTable = malloc(sizeof(count_table *)),但是这并不对size参数做任何事情。我应该为list_node_t分配空间吗?以下是我正在处理的内容。在C中使用malloc为typedef'd类型分配空间

在我给出的这个签名.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

你有不少很好的答案,但还没有人注意到一个重要的观点:`int`是有符号类型,除非你想有负面的大小,你应该使用`size_t`,这是typeof`运算符返回的类型,并传递给`malloc`和好友,并且旨在能够存储编译器允许的任何大小的数组的数组索引。你可能需要`size_t size`而不是`int size`。 – 2010-11-23 05:37:02

回答

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

是错误的。它应该是

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

而且,您还必须为list_node_t单独分配内存。

编辑:

除了什么克利福德指出关于列表节点分配内存,我觉得内存分配也应采取照顾char *key列表节点内。

+0

所以在函数中,我应该malloc的count_table然后malloc空间为list_node_t,然后把该列表节点内的count_table?我是否正确? – user516888 2010-11-23 02:44:51

+0

是的。你得到这个权利。 :)但是,请参阅Clifford关于list_node_t的双指针使用的回答。你需要检查它为什么作为一个双指针给出。谢谢! – Jay 2010-11-23 02:45:42

+2

+1,但我会写`count_table * cTable = malloc(sizeof * cTable);`个人。 – 2010-11-23 05:27:09

2

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

你会需要

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

每个列表节点将分别分配和cTable->尺寸和cTable-> list_array最后list_node_t::next相应更新。维护一个指向添加的最后一个节点的指针会使添加节点更快。

我不知道为什么count_table::list_arraylist_node_t**类型,而不是仅仅list_node_t*的(且同样称为list_array而不仅仅是list)。你的意图是它同时是一个数组还是一个列表?这会有点多余。该成员只需要指向第一个节点,然后通过list_node::next

1

访问连续节点除了其他海报人员指出,想将占据,我强烈建议你做这样的事情:

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

这将帮助你在情况cTable类型不断变化,你会不会有调整两个部分,以该行,只是类型。

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; 
} 

但是,你还需要检查一些错误条件:sizesizeof 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()类型)。