2013-07-16 48 views
0

我試圖寫一個簡單的代碼作爲sizeof(特別是在此代碼中的int)。但爲什麼它顯示1作爲輸出?它應該是4.sizeof的代碼?

#include<stdio.h> 
int SIZEOF(int *); 

int main(void) 
{ 
    int a; 
    printf("Size is:%d bytes\n",SIZEOF(&a)); 

    return 0; 
} 

int SIZEOF(int *p1) 
{ 
    int *p2; 
    p2=p1; 

    p1++; 

    return (p1-p2); 
} 
+1

出於同樣的原因,'p1 ++'增加'sizeof(int)','p1-p2'是'sizeof(int)'的單位差。首先強制轉換爲char *',其大小通常爲1. – GManNickG

+0

'+ 1'指針指向它自己類型的下一個位置。 (這不是遞增地址值,而是邏輯遞增,這對於編程非常有用)指針運算與值運算不同 –

回答

6

指針運算以指向類型的大小爲單位進行工作。當你做p1 - p2時,你得到int單位的數量,而不是char單位的數量。添加一些石膏:

return (char *)p1 - (char *)p2; 

編者按:SIZEOF也許應該返回ptrdiff_tsize_t

2

指針算術再次命中。就像p1++將指針遞增1 * sizeof(pointer),p1-p2將結果除以sizeof(p1)

2

指針算術將所指對象的大小考慮在內。如果您將指針p指定爲任何數據類型的數組,則++p將按照數據大小前進指針。當你減去兩者時,結果除以大小。

沒有使用sizeof關鍵字來實現這一點的便捷方式。

相關問題