代码之家  ›  专栏  ›  技术社区  ›  Ritwik Bose

我可以在c中指定一个类似Java的“构造函数”吗?

  •  0
  • Ritwik Bose  · 技术社区  · 15 年前

    我想用c语言“构造”(读:malloc和memset)我的哈希表。为此,我创建了一个函数,如下所示:

    int maketable(struct hash_entry **table, int size){
    
        table = (struct hash_entry **)malloc(size*sizeof(struct hash_entry *));
        int i = 0;
        for (; i<size; i++) {
            memset(table[i], '\0', sizeof(struct hash_entry *));
        }
        return 0;
    
    }
    

    struct hash_entry **table[size]
    

    在输入这段代码之前,当我从maketable返回时不会丢失任何东西,对吗?

    编辑: 路过吗 table 进入 maketable() 桌子 指向,将保留更改吗?

    我正在尝试将指针数组分配给散列_项的指针

    3 回复  |  直到 15 年前
        1
  •  4
  •   nos    15 年前

    您的代码正在分配给本地服务器 table 变量,则调用方不受影响。这会导致内存泄漏。

    在函数外部,您已将表声明为指向struct hash_entry指针的指针数组-我猜您只需要指向struct hash entry指针数组。

    作为一个数组,不需要对该空间进行malloc。您只需要一个循环将其中的每个元素设置为NULL(不要将每个元素都设置为零)。

    如果目标是分配整个表,这就是您要寻找的:

    struct hash_entry **table;
    ...
    int maketable(struct hash_entry ***table, int size){
    
        *table = malloc(size* sizeof **table);
        int i = 0;
        for (; i<size; i++) {
           (*table)[i] = NULL;
        }
        return 0;
    }
    

    就像

    maketable(&table,100);
    

    struct hash_entry ** maketable(int size){
       return calloc(size, sizeof(struct hash_entry *));
    }
    

    如果声明 struct hash_entry **table[size] 如果确实是您想要的,您需要告诉我们maketable()函数实际应该做什么(例如,您是否希望将动态分配的“数组”作为该表中的元素之一?

        2
  •  2
  •   Anon.    15 年前

    malloc * table

    另外,使用它的典型方法是声明一个指向哈希表的指针并传递 地址

        3
  •  1
  •   John Bode    15 年前

    您是否正在尝试分配哈希项表(即 table[i] struct hash_entry ),一桌 指针 散列_条目(即 表[i] struct hash_entry * ),还是别的什么?根据您的代码读取方式,我假设第一种情况,但如果这是错误的,请告诉我。

    假设您正在动态分配一个 结构散列项

    struct hash_entry *table; // 1 *, no array dimension
    

    功能应该是 打电话 作为

    int result = maketable(&table, number_of_elements);
    

    定义 作为

    int maketable (struct hash_entry **table, size_t size)
    {
      int r = 0;
    
      // sizeof **table == sizeof (struct hash_entry)
      *table = malloc(sizeof **table * size);
      // *ALWAYS* check the result of malloc()
      if (*table)
      {
        size_t i;
        for (i = 0; i < size; i++)
          memset(&(*table)[i], 0, sizeof (*table)[i]);
        r = 1;
      }
      return r;
    }
    

    有几件事需要指出。首先,不要投出结果 malloc() malloc() 在范围内。其次,你可以使用 sizeof 对象而不是类型上的运算符。这有助于减少一些维护难题(例如,如果您更改了 table 在参数列表中,您不必更改 sizeof

    最后,请注意 表的类型被传递给函数;因为我们要给一个 指针值

    如果您试图创建指向的指针表 结构散列项

    调用方中的表声明应为

    struct hash_entry **table; // 2 *, no array dimension
    

    功能应该是 打电话 作为

    int result=maketable(&表,元素的数量);
    

    定义 作为

    int maketable (struct hash_entry ***table, size_t size)
    {
      int r = 0;
    
      // sizeof **table == sizeof (struct hash_entry *)
      *table = malloc(sizeof **table * size);
      // *ALWAYS* check the result of malloc()
      if (*table)
      {
        size_t i;
        for (i = 0; i < size; i++)
          (*table)[i] = NULL;
        r = 1;
      }
      return r;
    }
    

    maketable 桌子 需要在应用下标之前取消引用,即。, (*table)[i] 桌子 ,而不是表指针本身。

    对不起,有什么困惑。