我有一堆结构声明如下:
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空间,用于保存结构数组。 我一直在玩这个,这就是我提出来的:
#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 *"
任何形式的帮助将不胜感激。
答案 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
答案 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));