2013-08-21 59 views
0
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

回答

5

因爲p的類型爲int *,所以*p的類型爲int,在您的實現中顯然是4個字節寬。


而且使用%zu打印size_t(什麼sizeof收益率),如果你不想讓你的程序來調用未定義的行爲。

+2

如果你的實現(*咳嗽*微軟*咳嗽*)不支持'「%zu」',則轉換爲'int'並使用'「%d」'或'「%i」'。 –

+0

@KeithThompson是的:)(MS將嚴重需要開始生活在二十一世紀,並支持至少C99 ...) – 2013-08-21 21:58:30

+1

或者,更好的,轉換爲'無符號長'並使用'「%lu」' –

4

sizeof(*p)是對象p點的大小int對象。

0

的sizeof(* P)將打印P,其是因爲INT但是C 4的大小是char這就是爲什麼它是1

0

在C(未C99)的sizeof操作者是一個嚴格的編譯時計算的。所以當sizeof (*p) [一個取整的ptr到一個整數]被評估,那麼int的大小是四。

注意。該聲明的(*p)部分是「鑄造」操作員。因此,sizeof不是函數調用,如sizeof(xyz),而是它像sizeof var_namesizeof (int *)

當您的程序運行時,它會更改p指向的對象,但sizeof (*p)的值已經計算並硬編碼到您的可執行文件加載模塊中。

我覺得你的困惑是,你認爲C會找出你的程序運行時指向的數據類型。