动态分配多个结构的数组

时间:2016-10-06 13:01:59

标签: c arrays struct

我有一堆结构声明如下:

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中每个元素的信息。

我正在尝试

  • data_t *data中数组index_t的malloc空间,用于保存结构数组。
  • 在结构数组需要时重新分配更多空间。
  • 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->data[count]的mallocing导致错误。这绝不是一个正确的程序,我只是想知道为什么这不起作用。我只是想看看如果我尝试更大的程序之前能够完成所有这三个步骤。

错误是:

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

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

3 个答案:

答案 0 :(得分:1)

这里错了很多。

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

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

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

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

答案 1 :(得分:1)

  

为什么我index->data[count]的mallocing导致错误

这是错误的,因为index->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 :(得分:1)

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));