在C语言中使用malloc为一个typedef'd类型分配空间。

问题描述 投票:3回答:4

我不知道到底要用什么来作为论据,才能 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;
};
c malloc typedef dynamic-memory-allocation
4个回答
7
投票
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 列表节点的内部。


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
投票

鉴于 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()).


1
投票

除了其他发帖者指出你只为指针分配了足够的空间,而不是你想要的数据将占据的空间之外,我强烈建议你做这样的事情。

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

这将会帮助你,以防万一... cTable 变化,你就不必调整这一行的两个部分,只需调整类型。

© www.soinside.com 2019 - 2024. All rights reserved.