2016-10-06 39 views
1

我有一大堆的声明如下结构:Dynammically分配多个结构的数组

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每个元素的信息创建结构的数组。

我想

  • malloc的空间阵列data_t *dataindex_t持有结构的数组。
  • 当结构数组需要时,可以重新分配更多空间。结构的阵列中的每个元素
  • 的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]正在导致错误。这不是一个合适的程序,我只是想知道为什么这不起作用。我只是想看看在我尝试一个更大的程序之前,如果我能完成所有这三个步骤的工作。

的错误是:

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

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

+2

'index'指向一个未知的位置。 – haccks

+0

'data_t * data'不是数组! – Olaf

+0

@Olaf哦,当然,是否'data_t ** data'是我所追求的? – RoadRunner

回答

1

已经得到了)然后循环,为什么我的index->data[count] mallocing导致错误

这是错误的,因为index->data[count]是类型data_t,但不data_t*,所以它不能保存地址由malloc()

返回到它返回void*这是隐式转换,你不需要投malloc()价值的方式变量的类型,它变得分配到

除此之外,正如其他人所指出的,你没有初始化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

1

在这里错了很多很多。

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

index未分配,所以你需要做的第一

然后在你的初始分配的顶部ReAlloc如果

如果数据是一个数组,那么你需要将它们分配数组(您“通过初始化值

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

是的,我从这个错误。但感谢您的答案。 – RoadRunner