具有数据结构的双指针运算

Arithmetic of the double pointers with a data structure

我尝试编写哈希表并找到了这个 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. Why there using the typedef struct entry_s entry_t; instead of
struct entry_s
{
    char* key;
    char* value;
    struct entry_s* next;
}entry_t; 

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

  1. What does that code mean: struct entry_s** table;

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

Why there using typedef struct entry_s entry_t; instead of

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 字段。然后,为了区分结构体的"internal"使用和外部使用,我们定义一个别名类型:

typedef struct my_linked_list_s my_linked_list_t;

或者,在您的情况下:

typedef struct entry_s entry_t;

尽管这不是必需的,但您的实施已选择这样做。您可以看到命名约定:_s 代表 "structure" 和 _t 代表 "type".

Because if i use second way i will have error.

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

What does that code mean: struct entry_s** table;

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

要更好地了解 C 哈希表,请查看

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

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