我正在编写一个很大的代码,我需要输入很多结构,然后使用void指针来表示这些结构的变量,例如:
typedef struct {
int age;
double height;
}human_t;
然后我将声明并初始化一个类型的变量:" human_t"
human_t peter = {
21,
1.95 };
然后我将制作一个指向彼得的空指针:
void* ptr = &peter;
我后来需要知道的是" ptr"是指向" human_t"类型的变量的指针。我怎样才能做到这一点 ?在C中有某种预定义的方法吗?对不起我的无知:)还是初学者。
答案 0 :(得分:4)
不,这是不可能的“开箱即用”。
它需要运行时类型信息以某种方式与指针相关联,而这根本就不存在。 void
指针是一个内存地址,仅此而已。
当然,与高级语言中存在的许多内容一样,您可以自己实现它。
对于这种情况,您可以要求每个受支持的struct
都以指定其类型的enum
开头。然后,您可以将指向struct的指针转换为指向该枚举的指针,读取其值,然后知道您正在处理的是哪种类型:
typedef enum {
ObjectType_Human,
ObjectType_Alien,
ObjectType_Predator,
ObjectType_Smurf,
} ObjectType;
typedef struct {
ObjectType type;
int age;
char name[32];
} human;
然后你可以这样做:
void print_name(const void *obj)
{
const ObjectType *tp = obj; /* No cast required! */
switch(*tp)
{
case ObjectType_Human:
printf("the human is called %s\n", ((human *) obj)->name);
break;
/* and so on ... */
}
}
例如,您也可以将类型信息放在地图中,并在指针值上进行哈希处理。
有很多方法;你将不得不分析并选择最适合你特定应用的那个。
答案 1 :(得分:2)
唉,这在C中实施起来并不容易。
一种方法是标准化您的结构,以便第一个元素是一个类型字段。
C标准保证结构的地址始终与第一个元素的地址对齐(即在第一个结构成员之前没有填充)。因此,首先将void*
转换为类型字段是安全的,并根据该结果投射到您选择的结构。