如何解决从不同类型的结构转换为void *
我正在尝试实现自己的哈希表,并且将结构定义为:
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语言中要做的事情。
尽管如此,使用此语言的程序的bug风险有所增加,这部分是为什么开发其他语言以更好地支持多态性的部分原因。如果您可以选择使用另一种语言,那么对这样的东西使用C可能是个坏习惯。
从根本上,您应该注意,使用从value
检索到的struct htab_item_t
时,实际的对象类型是已知的,并且指针在访问该对象之前已正确转换为该类型。 / p>
应该有可能,因为每种类型的指针长度都相同。
这不是C标准所保证的。除了某些特定的约束,指向不同类型的指针的大小可能也不同。
但是,这不是问题,因为您将不会存储指向不同类型的指针。当指针存储在value
字段中时,它将被转换为void *
。从value
字段中读取指针时,会将其转换为适当的类型。因此,value
中存储的内容将始终为void *
,并具有适当的大小。
用于指针转换的C规则保证,只要使用正确的类型访问每个对象,该规则就始终适用于指向对象的指针。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。