【问题标题】:Arithmetic of the double pointers with a data structure具有数据结构的双指针的算术
【发布时间】:2020-08-19 19:38:27
【问题描述】:

我尝试编写哈希表并找到了这个 github 存储库:enter link description here。我很难理解这段代码:

struct entry_s
{
    char* key;
    char* value;
    struct entry_s* next;
};

typedef struct entry_s entry_t;

struct hashtable_s 
{
    int size;
    struct entry_s** table;
};

typedef struct hashtable_s hashtable_t;

我有两个问题:

  1. 为什么使用typedef struct entry_s entry_t; 而不是
struct entry_s
{
    char* key;
    char* value;
    struct entry_s* next;
}entry_t; 

因为如果我使用第二种方式,我会出错。

  1. 该代码是什么意思:struct entry_s** table;

我知道这个问题很容易回答,但如果你能帮助我,我会很高兴

【问题讨论】:

  • 你应该更好地阅读编译器给出的错误信息,以及更多地了解你正在使用的数据结构类型,有很多资源详细介绍了X的逐步实现。

标签: c pointers data-structures hashtable double-pointer


【解决方案1】:

第二个问题的答案是,您正在标记一个指针数组,该数组可以存储 struct entry_s** 类型的指针。

【讨论】:

    【解决方案2】:

    为什么使用typedef struct entry_s entry_t; 而不是

    struct entry_s
    {
        char* key;
        char* value;
        struct entry_s* next;
    };entry_t;
    

    您提供的语法不正确,并且没有按照您的想法进行。最后一行};entry_t; 被视为一个新语句,因为您的编译器期望在每个; 之后都会有一个新语句。你要写的是如下代码:

    struct entry_s
    {
        char* key;
        char* value;
        struct entry_s* next;
    } entry_t;
    

    这个结构是一个链表,可以看到其中一个字段(最后一个)使用相同的结构来保存一个数据。用更抽象的方式,你可以看到这样的代码:

    struct my_linked_list_s
    {
        T data;
        struct my_linked_list_s *next;
    };
    

    在 C 中,一种递归数据类型(即在其自己的定义中使用的)需要一个指针(出于测量结构大小的原因*),这就是我们在 next 字段中看到一个指针的原因.然后,为了区分结构的“内部”使用和外部使用,我们定义了一个别名类型:

    typedef struct my_linked_list_s my_linked_list_t;
    

    或者,在你的情况下:

    typedef struct entry_s entry_t;
    

    虽然这不是必需的,但您的实现已选择这样做。您可以看到命名约定:_s 表示“结构”,_t 表示“类型”。

    因为如果我使用第二种方式,我会出错。

    您应该更仔细地阅读编译器的错误消息,它会帮助您了解问题所在。

    该代码是什么意思:struct entry_s** table;

    这是一个指针数组。您的实现选择使用链表和指针,this function 清楚地描述了添加部分。

    如需更好地了解 C 哈希表,请查看this answer

    *要确定结构的大小 (sizeof(struct my_struct)),使用所有字段大小的总和。如果我们要在不使用指针的情况下确定递归结构的大小(对于任何类型的数据,指针具有固定大小),那么该结构将具有无限大小。为了避免这个问题,我们因此使用了一个指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 2021-11-03
      • 2020-11-15
      • 2014-06-15
      • 2013-10-14
      • 1970-01-01
      相关资源
      最近更新 更多