[英]C | find the size of the value a void Pointer is pointing at using sizeof()
我試圖使用 sizeof() 來查找空指針指向的值的大小,我想用它來打印值。
這段代碼
int num = 5;
void *voidPtr;
voidPtr = #
printf("%d", sizeof(*voidPtr));
打印,1。我怎樣才能打印 4?
如果有任何其他方法可以打印 void 指針的值,請告訴我
提前致謝。
指針的值僅傳達對象的起始地址,而不是有關其大小的任何信息。
如果指針是完整類型,則指針的類型固有地傳達有關它指向的對象大小的信息。 但是, void
是不完整的,並且void *
不提供有關它源自的對象大小的信息(除非可能是標准 C 的擴展和調試功能)。
通常,如果您的程序需要知道void *
指向的大小,它必須自己跟蹤該信息。
*voidPtr
在標准 C 中無效。它是 GCC 擴展,這就是sizeof(*voidptr)
為1
。 任何其他(非 GCC 系列)編譯器都不會編譯此代碼。
%d
是打印size_t
的錯誤格式。 你應該使用%zu
代替。
在 C 中無法確定void
指針所引用的大小對象
void
類型是不完整的類型。 這意味着void
類型的表達式的大小是未定義的。
來自 C 標准(6.2.5 類型)
19 void 類型包含一組空值; 它是無法完成的不完整對象類型
和(6.5.3.4 sizeof 和 alignof 運算符)
1 sizeof 運算符不得應用於具有函數類型或不完整類型的表達式,...
一些向后兼容的編譯器使sizeof( void )
等於sizeof( char )
,即1
。
如果需要使用void *
類型的指針獲取指向對象的大小,則需要將指針轉換為引用對象類型的指針,例如
printf("%zu", sizeof( *( int * )voidPtr));
請注意,您需要將轉換說明符%zu
與size_t
類型的表達式一起使用。
我猜你是這么想的:
printf( "%d", sizeof voidPtr );
它是voidPtr
變量的大小,而不是指向值*voidPtr
。 如果程序編譯為 32 位, sizeof voidPtr
將為 4。 PS: sizeof
與變量/對象一起使用時不需要括號,而不是類型。 例如sizeof MyVariable
與sizeof (long)
。
你說,“我試圖找到一個空指針指向的值的大小”,在你的代碼中指向一個整數,所以使用這個:
printf("%d", sizeof(int));
理解 'sizeof()' 必須在編譯時知道類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.