使用指针指针访问结构中的指针指针

时间:2014-07-13 20:14:23

标签: c pointers

我有一个指向结构的指针,我试图访问该结构中的指针指针指针。我一直收到一条错误消息:"请求成员'桶'在某种结构或联合的东西中。"我在错误旁边评论过。所以我的问题是,如何正确访问存储桶并为其分配内存。

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;
}

2 个答案:

答案 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_sizeBucket分配空间,但是将内存分配给指向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;
}