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

时间:2010-11-23 02:24:15

标签: c malloc typedef

我不确定我需要使用什么作为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 个答案:

答案 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的类型发生变化,这将有助于您,您不必将两个部分调整到该行,只需要调整类型。