丙 |使用 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 指针的值,请告诉我
提前致谢。
*voidPtr
在标准 C 中无效。它是 GCC 扩展,这就是 sizeof(*voidptr)
是 1
的原因。任何其他(非 GCC 系列)编译器都不会编译此代码。
%d
是打印 size_t
的错误格式。您应该改用 %zu
。
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)
.
我正在尝试使用 sizeof() 来查找 void 指针指向的值的大小,我想用它来打印该值。
此代码
int num = 5;
void *voidPtr;
voidPtr = #
printf("%d", sizeof(*voidPtr));
打印,1。 我怎样才能让它打印 4?
如果有任何其他方法可以打印 void 指针的值,请告诉我
提前致谢。
*voidPtr
在标准 C 中无效。它是 GCC 扩展,这就是sizeof(*voidptr)
是1
的原因。任何其他(非 GCC 系列)编译器都不会编译此代码。%d
是打印size_t
的错误格式。您应该改用%zu
。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)
.