繁体   English   中英

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

[英]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的成员。

(注意:您缺少第二个typedefTable;

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM