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

Conversion to (void *) from different types in structure

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

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

但现在我正在考虑切换到下面定义的结构并将每个输入值重新键入为 (void *),因为这样 table 可以针对不同的类型进行初始化,并且将留给用户决定使用哪个他想要的。这应该是可能的,因为指针对于每种类型具有相同的字节长度。

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

但我的问题是,它是否考虑了不良做法以及它是否有害。

这是一种好的做法,也是一种不好的做法,并且可能有害。

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

尽管如此,使用它的程序出现错误的风险有所增加,这在一定程度上是开发其他语言以更好地支持多态性的原因。如果您可以选择使用其他语言,那么使用 C 来做这样的事情可能是一种不好的做法。

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

It should be possible as pointers are of the same byte lenght for each type.

C 标准不保证这一点。除了一些特定的限制,指向不同类型的指针可能有不同的大小。

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

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