我試圖使用 sizeof() 來查找空指標指向的值的大小,我想用它來列印值。
這段代碼
int num = 5;
void *voidPtr;
voidPtr = #
printf("%d", sizeof(*voidPtr));
列印,1. 我怎樣才能列印 4?
如果有任何其他方法可以列印 void 指標的值,請告訴我
提前致謝。
uj5u.com熱心網友回復:
指標的值僅傳達物件的起始地址,而不是有關其大小的任何資訊。
如果指標是完整型別,則指標的型別固有地傳達有關它指向的物件大小的資訊。但是,void是不完整的,并且 avoid *沒有提供有關它源自的物件大小的資訊(除非可能是標準 C 的擴展和除錯功能)。
通常,如果您的程式需要知道 avoid *指向什么的大小,它必須自己跟蹤該資訊。
uj5u.com熱心網友回復:
*voidPtr在標準C.無效這是一個GCC擴展,這就是為什么的原因sizeof(*voidptr)是1。任何其他(非 GCC 系列)編譯器都不會編譯此代碼。%d是錯誤的列印格式size_t。你應該%zu改用。在 C 中沒有辦法確定
void指標所參考的大小物件
uj5u.com熱心網友回復:
型別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。
uj5u.com熱心網友回復:
我猜你是這么想的:
printf( "%d", sizeof voidPtr );
它是voidPtr變數的大小,而不是指向的值*voidPtr。sizeof voidPtr如果程式編譯為 32 位,則為 4。PS:sizeof與變數/物件一起使用時不需要括號,而不是型別。例如sizeof MyVariablevs sizeof (long)。
uj5u.com熱心網友回復:
你說,“我試圖找到一個空指標指向的值的大小”,在你的代碼中指向一個整數,所以使用這個:
printf("%d", sizeof(int));
理解 'sizeof()' 必須在編譯時知道型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/344544.html
下一篇:關于C 中運算子多載的困惑
