[英]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.4C 2011年在線草案sizeof
和_Alignof
運算符
約束
1sizeof
運算符不得應用於具有 function 類型或不完整類型的表達式、此類類型的括號名稱或指定位字段成員的表達式。_Alignof
運算符不應應用於 function 類型或不完整類型。
void
是無法完成的不完整類型 - 您無法創建該類型的 object,因此在其上使用sizeof
是編碼錯誤,句號。
但是,出於某種原因,某些實現決定讓sizeof (void)
評估為 1,除非您處於“迂腐”模式。 顯然有人認為它在某些情況下很有用,但我不建議使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.