2014-08-28 62 views
0

以下是我的代碼:的sizeof()爲NULL

#include <stdio.h> 

struct abc 
{ 
    char a; 
    int b; 
}; 

int main() 
{ 
    struct abc *abcp = NULL; 
    printf("%d", sizeof(*abcp)); //Prints 8 

    /* printf("%d",*abcp);   //Causes program to hang or terminate */ 

    return 0; 
} 

我明白結構的大小是8由於結構填充。然而,爲什麼'abcp'的sizeof()在'abcp'賦值時給NULL賦值? 'abcp'分配NULL時意味着它沒有指向任何地方?但是,爲什麼我得到上述代碼的輸出?

回答

4

sizeof不是一個函數,它不評估它的參數。相反,它會在編譯時推導出*abcp的類型,並報告其大小。由於abcpstruct abc*,所以*abcp的類型是struct abc,而不管abcp點在哪裏。

6

sizeof是一個操作符,而不是一個函數。

你會想起這個,如果你放棄了無謂的括號,只是寫:

printf("%zu", sizeof *abcp); 

這也用來格式化size_t類型,這是%zu值的C99-有道。

它可以工作,因爲編譯器在編譯時計算大小,而不必遵循(取消引用)當然指針(因爲指針還不存在;程序沒有運行)。

2

C99標準

6.5.3.4/2

The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant.

0

鑑於Type *var,下面的表達式是等價的:

sizeof(Type) 
sizeof(*var) 
sizeof(var[N]) // for any constant integer expression N 
sizeof(var[n]) // for any variable integer expression n 

這些表達式中的每一個分解成在編譯期間爲恆定值

因此,運行期間var的值對這些表達式中的任何一個都沒有影響。

0

sizeof只是返回* abcp的大小,並且此指針在您的機器中的大小爲8。存儲在指針中的地址是否有效並不重要(NULL通常是無效地址)。

+0

由於「此指針的大小爲8」,所以不返回8。 8返回,因爲這是'abcp'指向的結構指針的大小。要重新調整指針的大小,代碼將使用'sizeof abcp'。 – chux 2014-08-28 14:45:54