[英]Using a pointer-to-pointer to access a pointer-to-pointer in a structure
我有一个指向结构的指针,并且我正在尝试访问该结构内的指针到指针的指针。 我不断收到错误消息:“在结构或联合体中请求成员'buckets'”。 我在错误旁评论。 所以我的问题是,如何正确访问存储桶并为其分配内存。
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;
}
根据您的分配情况:
(*table)->buckets = malloc(table_size * sizeof(Bucket));
似乎您正在尝试为table_size存储桶而不是为bucket的table_size指针创建空间。 该分配应为:
(*table)->buckets = malloc(table_size * sizeof(Bucket*));
我认为该错误在while循环中进一步下降。 运算符->优先于[],优先于*,因此,您实际上是在说*(table-> buckets [iterate ++]),而table是指针指针,因此没有名为bucket的成员。
(注意:您缺少第二个typedef
的Table;
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.