3

我不确定我需要使用什么作为参数来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

4 回答 4

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

是错的。它应该是

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

此外,您还必须为 list_node_t 单独分配内存。

编辑:

除了 Clifford 指出的为列表节点分配内存之外,我认为内存分配也应该注意char *key列表节点的内部。

于 2010-11-23T02:40:35.147 回答
2

鉴于int是 created 的“大小”参数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;
}

但是,您还需要检查一些错误情况:sizeby的乘法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是一个常数,等于 a 的最大值size_t它是 的参数类型malloc())。

于 2010-11-23T05:00:40.687 回答
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是 typelist_node_t**而不是 just list_node_t* (同样被称为list_array而不是 just list)。你的意图是它同时是一个数组和一个列表吗?那会有些多余。成员只需是指向第一个节点的指针,然后通过以下方式访问后续节点list_node::next

于 2010-11-23T02:41:14.777 回答
1

除了指出您只是为指针分配足够空间而不是您想要的数据将占用的空间的其他海报之外,我强烈建议您这样做:

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

如果类型cTable发生变化,这将对您有所帮助,您无需调整该行的两个部分,只需调整类型即可。

于 2010-11-23T02:55:11.790 回答