我有这个结构的问题,我不明白为什么不起作用。我创建了一个包含3个值的结构,我想要这个SIZE = 100的数组。但是我对malloc以及它在这种情况下的工作原理感到困惑。
#define SIZE 100
typedef struct entry {
long id;
int r1;
int r2;
int r3;
};
typedef struct entry * THash; //[SIZE];
THash init ()
{
int i;
THash t = malloc(SIZE*sizeof(struct entry));
for(i = 0; i<SIZE; i++){
t[i] = malloc(sizeof(struct entry));
t[i].id = -1;
t[i].r1 = -1;
t[i].r2 = -1;
t[i].r3 = -1;
}
return t;
}
答案 0 :(得分:0)
所以你在当前程序中所做的是,正如Ajay在评论中指出的那样,分配内存两次。 让我们分析一下代码中的两个不同的malloc,看看它们做得更好,这样你才能理解发生了什么:) 第一个malloc,即:
THash t = malloc(SIZE*sizeof(struct entry));
使用惊人的(和救生)C函数sizeof
来获取结构的尺寸,并将结构所需的空间分配100次。也就是说它在内存中占用一个指针并从该点开始分配内存,直到达到100个结构所需的量。然后将指针存储在t中,实际上是一个数组。
然后,您可以使用t [0],t [1]等简单地访问您的数组及其内容,就像它是一个简单的数组一样。
您使用第二个malloc
做了什么,即
t[i] = malloc(sizeof(struct entry));
正在重新分配你已经分配的一些空间并尝试将指向新分配的区域的指针分配给指向结构的指针(我知道这非常麻烦),实际上,如果你尝试编译你的代码,你可以# 39; ll得到以下错误,该函数将无法编译:
error: assigning to 'struct entry' from incompatible type 'void *'
t[i] = malloc(sizeof(struct entry));
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
因此,为了使函数正常工作,您只需要删除第二个malloc。我希望自己能够清楚地知道函数在你的情况下做了什么,但是如果你需要进一步的解释,可以随意提出更多的问题