C语言中如何用sizeof获取void指针指向值的大小并打印对应值
问题原因分析
C语言标准中void是不完整类型,没有确定的大小,因此sizeof(void)属于未定义行为。你当前看到的输出1是GCC等编译器的非标准扩展,默认将sizeof(void)处理为1,不具备可移植性。
修改方法(输出4)
因为你存储的voidPtr实际指向int类型的变量,只需要在解引用前将void指针强制转换为int*类型即可,修改后代码如下:
int num = 5; void *voidPtr; voidPtr = # printf("%d", sizeof(*(int*)voidPtr));
上述代码中*(int*)voidPtr会被识别为int类型,32位int的大小为4字节,即可输出预期结果。
打印void指针指向值的其他方法
void指针本身不携带指向数据的类型信息,因此使用前必须手动指定其指向的具体数据类型:
- 已知指向int类型时,直接强转后解引用打印值:
printf("指向的int值为:%d", *(int*)voidPtr);
- 如果需要支持多种类型的通用存储,可以搭配类型标签使用,示例如下:
// 定义类型标签枚举 typedef enum { TYPE_INT, TYPE_FLOAT, TYPE_CHAR } DataType; // 封装通用数据结构 typedef struct { DataType type; void* data; } GenericData; // 使用示例 int num = 5; GenericData data = { .type = TYPE_INT, .data = # }; // 打印时根据类型判断处理 switch(data.type) { case TYPE_INT: printf("int值:%d", *(int*)data.data); break; case TYPE_FLOAT: printf("float值:%f", *(float*)data.data); break; case TYPE_CHAR: printf("char值:%c", *(char*)data.data); break; default: printf("未知类型"); }
注意事项
- 不要依赖
sizeof(void) == 1的编译器扩展,该写法不符合C标准,跨编译器运行可能出现不可预期的结果。 - void指针不允许直接解引用,所有操作前必须强转为对应具体类型的指针。
内容的提问来源于stack exchange,提问作者Ran Firrer
相关产品推荐
相关产品推荐

