我有一个指向结构的指针,我试图访问该结构中的指针指针指针。我一直收到一条错误消息:"请求成员'桶'在某种结构或联合的东西中。"我在错误旁边评论过。所以我的问题是,如何正确访问存储桶并为其分配内存。
typedef struct bucket {
char *key;
void *value;
struct bucket *next;
} Bucket;
typedef struct {
int key_count;
int table_size;
void (*free_value)(void *);
Bucket **buckets;
}
int create_table(Table ** table, int table_size, void (*free_value)(void *)){
int iterate = 0;
*table = malloc(sizeof(Table));
if(table && table_size != 0) {
(*table)->key_count = 0;
(*table)->table_size = table_size;
(*table)->free_value = free_value;
(*table)->buckets = malloc(table_size * sizeof(Bucket)); /* Error is here */
while(iterate < table_size)
*table->buckets[iterate++] = NULL;
return SUCC;
}
return FAIL;
}
答案 0 :(得分:3)
看看你的分配:
(*table)->buckets = malloc(table_size * sizeof(Bucket));
看起来好像是在尝试为table_size存储桶创建空间而不是为存储桶创建table_size指针。分配应该是:
(*table)->buckets = malloc(table_size * sizeof(Bucket*));
我认为错误在while循环中进一步下降。运营商 - &gt;优先于[]优先于*,因此你实际上是在说*(table-&gt; buckets [iterate ++]),而table是一个指针指针,因此没有一个名为bucket的成员。
答案 1 :(得分:1)
(注意:您在第二个Table;
中遗漏了typedef
。
int create_table(Table ** table, int table_size, void (*free_value)(void *)){ int iterate = 0; *table = malloc(sizeof(Table)); if(table && table_size != 0) {
这是不对的。您应该在分配内存之前测试table
,然后测试*table
。
(*table)->key_count = 0; (*table)->table_size = table_size; (*table)->free_value = free_value; (*table)->buckets = malloc(table_size * sizeof(Bucket)); /* Error is here */
在这里,您为table_size
个Bucket
分配空间,但是将内存分配给指向Bucket
的指针。您似乎希望将table_size
个指针分配给Bucket
。
while(iterate < table_size) *table->buckets[iterate++] = NULL;
这与*(table->buckets[iterate++])
相同,这显然是错误的。 table
不是指向struct的指针,*table
是。这是你真正的错误所在。
我可能会写这样的东西:
typedef struct {
int key_count;
int table_size;
void (*free_value)(void *);
Bucket **buckets;
} Table;
int create_table(Table **table, int table_size, void (*free_value)(void *))
{
if (!table || table_size == 0) {
return FAIL;
}
*table = malloc(sizeof(Table));
if (*table) {
(*table)->key_count = 0;
(*table)->table_size = table_size;
(*table)->free_value = free_value;
(*table)->buckets = malloc(table_size * sizeof(Bucket *));
if ((*table)->buckets) {
int iterate = 0;
while(iterate < table_size)
(*table)->buckets[iterate++] = NULL;
return SUCC;
}
}
if (*table) {
free ((*table)->buckets);
}
free (*table);
return FAIL;
}