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