char c[] = {'a','b','c'};
int* p = &c[0];
printf("%i\n", sizeof(*p)); //Prints out 4
printf("%i\n", sizeof(*c)); //Prints out 1
我對這段代碼非常困惑。 p和c都表示第0個索引處的數組c的地址。但爲什麼sizeof(* p)打印出4呢?它不應該是1嗎?C - SizeOf Pointers
char c[] = {'a','b','c'};
int* p = &c[0];
printf("%i\n", sizeof(*p)); //Prints out 4
printf("%i\n", sizeof(*c)); //Prints out 1
我對這段代碼非常困惑。 p和c都表示第0個索引處的數組c的地址。但爲什麼sizeof(* p)打印出4呢?它不應該是1嗎?C - SizeOf Pointers
因爲p
的類型爲int *
,所以*p
的類型爲int
,在您的實現中顯然是4個字節寬。
而且使用%zu
打印size_t
(什麼sizeof
收益率),如果你不想讓你的程序來調用未定義的行爲。
sizeof(*p)
是對象p
點的大小int
對象。
的sizeof(* P)將打印P,其是因爲INT但是C 4的大小是char這就是爲什麼它是1
在C(未C99)的sizeof
操作者是一個嚴格的編譯時計算的。所以當sizeof (*p)
[一個取整的ptr到一個整數]被評估,那麼int
的大小是四。
注意。該聲明的(*p)
部分是「鑄造」操作員。因此,sizeof不是函數調用,如sizeof(xyz)
,而是它像sizeof var_name
或sizeof (int *)
。
當您的程序運行時,它會更改p指向的對象,但sizeof (*p)
的值已經計算並硬編碼到您的可執行文件加載模塊中。
我覺得你的困惑是,你認爲C會找出你的程序運行時指向的數據類型。
如果你的實現(*咳嗽*微軟*咳嗽*)不支持'「%zu」',則轉換爲'int'並使用'「%d」'或'「%i」'。 –
@KeithThompson是的:)(MS將嚴重需要開始生活在二十一世紀,並支持至少C99 ...) – 2013-08-21 21:58:30
或者,更好的,轉換爲'無符號長'並使用'「%lu」' –