gpt4 book ai didi

c - 动态分配多个结构的数组

转载 作者:太空宇宙 更新时间:2023-11-04 01:53:01 25 4
gpt4 key购买 nike

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

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->​​data[count] 的分配会导致错误。这绝不是一个合适的程序,我只是想知道为什么它不起作用。在我尝试更大的程序之前,我只是想看看我是否可以让所有这三个步骤都起作用。

错误是:

错误:从类型“void *”分配给类型“data_t”时类型不兼容

如有任何帮助,我们将不胜感激。

最佳答案

why my mallocing of index->data[count] is causing an error

这是错误的,因为 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

关于c - 动态分配多个结构的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39896752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com