簡體   English   中英

sizeof 運算符在 c 中顯示錯誤的結構大小

[英]sizeof operator shows wrong size of struct in c

有這個簡單的代碼:

#include <stdio.h>

typedef struct
{
    int a;
    char c;
} foo;

void func(void *arg)
{
    printf("sizeof arg: %ld\n", sizeof(*arg));
}

int main()
{
    foo f = {6, 'c'};
    func(&f);

    printf("the real sizeof struct foo: %ld\n", sizeof(f));
}

output:

sizeof arg: 1
the real sizeof struct foo: 8

如您所見,function 顯示錯誤的結果。 如果原因是'sizeof' 對不完整類型的無效應用,那么為什么它顯示sizeof arg: 1 void不是1個字節長,而是不完整的類型,那么為什么會出現這個結果呢?

您正在嘗試獲取 C 標准不允許的void大小。 但是,某些實現將sizeof(void)定義為 1,這就是您在此處看到的。

function 無法知道您傳遞的void *實際上是foo * 您將需要其他方式來傳達該信息。

這個說法

printf("sizeof arg: %ld\n", sizeof(*arg));

是不正確的。 表達式*arg具有不完整的類型void 你需要寫

printf("sizeof arg: %ld\n", sizeof(* ( foo * )arg));

C 的早期版本沒有void類型。 相反,類型char被用作類型void 由於sizeof( char )始終等於1 ,因此一些編譯器為了向后兼容 C 的舊規范,將sizeof( void )設置為1 ,盡管從 C 標准的角度來看它是不正確的。

結果應該是診斷結果,因為sizeof (void)sizeof (*arg)解析為)是違反約束的:

6.5.3.4 sizeof_Alignof運算符

約束

1 sizeof運算符不得應用於具有 function 類型或不完整類型的表達式、此類類型的括號名稱或指定位字段成員的表達式。 _Alignof運算符不應應用於 function 類型或不完整類型。
C 2011年在線草案

void是無法完成的不完整類型 - 您無法創建該類型的 object,因此在其上使用sizeof是編碼錯誤,句號。

但是,出於某種原因,某些實現決定讓sizeof (void)評估為 1,除非您處於“迂腐”模式。 顯然有人認為它在某些情況下很有用,但我不建議使用它。

暫無
暫無

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

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