丙 |使用 sizeof() 查找 void 指针指向的值的大小

C | find the size of the value a void Pointer is pointing at using sizeof()

我正在尝试使用 sizeof() 来查找 void 指针指向的值的大小,我想用它来打印该值。

此代码

    int num = 5;
    void *voidPtr;
    voidPtr = #
    printf("%d", sizeof(*voidPtr));

打印,1。 我怎样才能让它打印 4?

如果有任何其他方法可以打印 void 指针的值,请告诉我

提前致谢。

  1. *voidPtr 在标准 C 中无效。它是 GCC 扩展,这就是 sizeof(*voidptr)1 的原因。任何其他(非 GCC 系列)编译器都不会编译此代码。

  2. %d 是打印 size_t 的错误格式。您应该改用 %zu

  3. C 无法确定 void 指针引用的对象大小

类型void是一个不完整的类型。这意味着 void 类型的表达式的大小未定义。

来自 C 标准(6.2.5 类型)

19 The void type comprises an empty set of values; it is an incomplete object type that cannot be completed

and (6.5.3.4 sizeof 和 alignof 运算符)

1 The sizeof operator shall not be applied to an expression that has function type or an incomplete type, ...

一些为了向后兼容的编译器使 sizeof( void ) 等于 sizeof( char )1.

如果您需要使用 void * 类型的指针来获取指向对象的大小,那么您需要将指针转换为引用对象类型的指针,例如

printf("%zu", sizeof( *( int * )voidPtr));

注意size_t.

类型的表达式需要使用转换说明符%zu

指针的值仅仅传达了一个对象的起始地址,而不是关于它的大小的任何信息。

如果指针是完整类型,则其类型本身就传达了有关其指向的对象大小的信息。但是,void 是不完整的,并且 void * 不提供有关其来源的对象大小的信息(除了可能通过标准 C 的扩展和调试功能)。

通常,如果您的程序需要知道 void * 指向的内容的大小,它必须自己跟踪该信息。

你说,“我试图找到一个空指针指向的值的大小”,在你的代码中指向一个整数,所以使用这个:

printf("%d", sizeof(int));

理解 'sizeof()' 必须在编译时知道类型。

我猜你是这么想的:

printf( "%d", sizeof voidPtr );

它是voidPtr变量的大小,而不是指向的值*voidPtr。如果程序编译为 32 位,sizeof voidPtr 将为 4。 PS:sizeof与variable/object一起使用时不需要括号,不用打字。例如。 sizeof MyVariable 对比 sizeof (long).