首页 文章

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

提问于
浏览
2

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

  • 2
    count_table* cTable = malloc(sizeof(count_table*))
    

    是错的 . 它应该是

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

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

    编辑:

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

  • 6

    您的建议: 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 的"size"参数,看起来您应该同时分配 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() 的参数类型) .

  • 1

    除了其他海报,他们指出你只为指针分配足够的空间,而不是你想要的数据所占据的空间,我强烈建议你做这样的事情:

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

    如果 cTable 的类型发生变化,这将有助于您,您不必将两个部分调整到该行,只需要调整类型 .

相关问题