【问题标题】:Dynammically allocating array of multiple structs动态分配的多个结构数组
【发布时间】:2016-10-06 13:01:59
【问题描述】:

我有一堆这样声明的结构:

typedef struct {
    int docid;
    int freq;
} pairs_t;

typedef struct {
    char *word;
    int numlines;
    pairs_t *pairs;
    int index;
    int npairs;
} data_t;

typedef struct {
    data_t *data;
    int numwords;
} index_t;

我想在index_t 中创建一个结构数组,其中index_t 将保存data_t 中每个元素的信息。

我正在尝试

  • index_t 内的数组 data_t *data 的 malloc 空间,用于保存结构数组。
  • 结构数组需要时重新分配更多空间。
  • 为结构数组中的每个元素分配足够的空间

我一直在玩这个,这就是我想出的:

#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[]) {
    int initialsize = 1;
    int count = 0;

    index_t *index;
    index->data = (data_t*)malloc(initialsize * sizeof(data_t));

    index->data = realloc(index->data, 2 * initialsize);

    index->data[count] = malloc(sizeof(data_t));

    count++;

    return 0;
}

我只是想知道为什么我的 index-&gt;data[count] 分配会导致错误。这不是一个合适的程序,我只是想知道为什么这不起作用。我只是想看看在尝试更大的程序之前是否可以使所有这三个步骤都起作用。

错误是:

error: incompatible types when assigning to type "data_t" from type "void *"

任何形式的帮助将不胜感激。

【问题讨论】:

    标签: c arrays struct


    【解决方案1】:

    为什么我对 index-&gt;data[count] 的 malloc 会导致错误

    这是错误的,因为index-&gt;data[count]的类型是data_t而不是data_t*,所以它不能保存malloc()返回的地址

    顺便说一句,您不需要转换 malloc() 的值,因为它返回 void*,它被隐式转换为分配给它的变量的类型

    除此之外,正如其他人指出的那样,您没有初始化 index


    这是处理您的问题的一种方法:

    int initialsize = 1;
    int count = 0;
    
    index_t *index;
    
    //allocating memory for index
    index = malloc(sizeof(index_t));
    
    //allocating memory for `data`
    index->data = malloc(initialsize * sizeof(data_t));
    
    int required_size = 7; //I chose 7 randomly
    
    //reallocating memory for `data`
    index->data = realloc(index->data, required_size * sizeof(data_t));
    
    count++;
    

    此外,如果您想为数据元素之一的pairs_t *pairs; 成员分配内存,您可以这样做:

    int required_size = 2;
    
    index->data = malloc(required_size * sizeof(data_t));
    
    //for first element of array
    index->data[0].pairs = malloc(required_size * sizeof(pairs_t)); 
    //you can even realloc
    index->data[0].pairs = realloc(index->data[0].pairs, 3 * sizeof(pairs_t));
    

    另外,别忘了在程序结束时释放 malloced 的数据


    这是一个总结一切的示例程序:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct {
        int docid;
        int freq;
    } pairs_t;
    
    typedef struct {
        char *word;
        int numlines;
        pairs_t *pairs;
        int index;
        int npairs;
    } data_t;
    
    typedef struct {
        data_t *data;
        int numwords;
    } index_t;
    
    int main(int argc, char *argv[]) 
    {
        int initialsize = 1;
        int count = 0;
    
        index_t *index;
        index = malloc(sizeof(index_t));
    
        int required_size = 1;
    
        index->data = malloc(required_size * sizeof(data_t));
    
        //for first element of array
        index->data[0].pairs = malloc(required_size * sizeof(pairs_t)); 
        //you can even realloc
        index->data[0].pairs = realloc(index->data[0].pairs, 1 * sizeof(pairs_t));
    
        //now you can access the members of pairs this way
    
        index->data[0].pairs[0].docid = 777;
        index->data[0].pairs[0].freq  = 777;
    
        printf("docid : %d\nfreq  : %d", index->data[0].pairs[0].docid, index->data[0].pairs[0].freq);
    
        free(index->data[0].pairs);
        free(index->data);
        free(index);
    
        count++;
    
        return 0;
    }
    

    输出:

    docid : 777
    freq  : 777
    

    工作样本:https://ideone.com/Bg6aWa

    【讨论】:

      【解决方案2】:

      是的,这里有很多错误。

      index_t *index;
      index->data = (data_t*)malloc(initialsize * sizeof(data_t));
      

      index 未分配,因此您需要先执行此操作

      然后在你的初始分配之上重新分配

      如果数据是一个数组,那么你需要分配一个数组(你已经得到了)然后循环初始化值

      【讨论】:

        【解决方案3】:
        index_t *index;
        

        这定义了一个指向index_t未初始化 指针。 它指向某个地方, 但此时你只是不知道在哪里。

        可悲的是,然后你写到这个指针指向的地方!

        index->data = ...
        

        从而覆盖一些糟糕的内存。 如果你幸运的话,这会导致你的程序崩溃。

        这样做:

        index_t index;
        

        index 存在,但其所有字段均未初始化。 这次是index.data 随机指向某个地方, 但我们不在乎,因为我们从不查看它指向的位置。

        index.data = (data_t*)malloc(1 * sizeof(data_t));
        index.data[0] = malloc(sizeof(data_t));
        index.data = (data_t*)realloc(index.data, 2 * sizeof(data_t));
        index.data[1] = malloc(sizeof(data_t));
        

        【讨论】:

          猜你喜欢
          • 2019-07-19
          • 2020-03-06
          • 2021-10-30
          • 2017-03-30
          • 1970-01-01
          • 2012-03-25
          • 2011-12-13
          相关资源
          最近更新 更多