C 从结构中的不同类型转换为(void*)

C 从结构中的不同类型转换为(void*),c,pointers,struct,hashtable,void-pointers,C,Pointers,Struct,Hashtable,Void Pointers,我正在尝试实现我自己的哈希表作为实践,我的结构定义如下: struct htab_item_t { char *key; int *value; struct htab_item_t *next; 但现在我正在考虑切换到下面定义的结构,并将每个输入值重新键入(void*),因为这样就可以为不同的类型初始化该表,并由用户决定他想要哪种类型。这应该是可能的,因为每种类型的指针具有相同的字节长度 struct htab_item_t { char *key;

我正在尝试实现我自己的哈希表作为实践,我的结构定义如下:

struct htab_item_t {
    char *key;
    int *value;
    struct htab_item_t *next;
但现在我正在考虑切换到下面定义的结构,并将每个输入值重新键入(void*),因为这样就可以为不同的类型初始化该表,并由用户决定他想要哪种类型。这应该是可能的,因为每种类型的指针具有相同的字节长度

struct htab_item_t {
    char *key;
    void *value;
    struct htab_item_t *next;

但是我的问题是,如果它被认为是不好的做法,如果它可能是有害的。

这是一个好的做法,一个不好的做法,可能是有害的

C是一种古老的语言,几乎不支持多态性。要管理多种类型的对象,必须使用
void*
。这是一个很好的实践,因为这是在C语言中必须做的

尽管如此,使用这种方法的程序出现错误的风险有所增加,这也是为什么其他语言在开发时对多态性有更好的支持的部分原因。如果您可以选择使用另一种语言,那么将C语言用于类似的事情可能是一种不好的做法

首先,您应该注意,当使用从
struct htab\u item\u t
检索的
值时,实际对象类型是已知的,并且指针在访问对象之前正确转换为该类型

这应该是可能的,因为每种类型的指针具有相同的字节长度

struct htab_item_t {
    char *key;
    void *value;
    struct htab_item_t *next;
这不是C标准的保证。除了一些特定的约束之外,指向不同类型的指针可能大小不同

但是,这不是问题,因为您不会存储指向不同类型的指针。当指针存储在
字段中时,它将转换为
void*
。从
字段读取指针时,指针将转换为相应的类型。因此,存储在
value
中的内容将始终是
void*
并具有适当的大小


指针转换的C规则保证,只要使用正确的类型来访问每个对象,这将始终适用于指向对象的指针。

使用
void*
会失去一些类型安全性,但会减少支持不同类型所需的代码量。使用它是相当普遍的。如果键的类型不同,则会更复杂。