簡體   English   中英

C | 使用 sizeof() 找出空指針指向的值的大小

[英]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 *指向的大小,它必須自己跟蹤該信息。

  1. *voidPtr在標准 C 中無效。它是 GCC 擴展,這就是sizeof(*voidptr)1 任何其他(非 GCC 系列)編譯器都不會編譯此代碼。

  2. %d是打印size_t的錯誤格式。 你應該使用%zu代替。

  3. 在 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));

請注意,您需要將轉換說明符%zusize_t類型的表達式一起使用。

我猜你是這么想的:

printf( "%d", sizeof voidPtr );

它是voidPtr變量的大小,而不是指向值*voidPtr 如果程序編譯為 32 位, sizeof voidPtr將為 4。 PS: sizeof與變量/對象一起使用時不需要括號,而不是類型。 例如sizeof MyVariablesizeof (long)

你說,“我試圖找到一個空指針指向的值的大小”,在你的代碼中指向一個整數,所以使用這個:

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

理解 'sizeof()' 必須在編譯時知道類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM