You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:45:04