2012-08-23 13 views
5

Cの構造体ポインタにNULLをキャストするメリットはありますか?例えばCの構造体ポインタにNULLをキャストしていますか?

:PostgreSQLのソースから

typedef struct List 
{ 
.... 
} List; 

List *listPtr = ((List *) NULL) ; 

例:

#define NIL      ((List *) NULL) 

http://doxygen.postgresql.org/pg__list_8h_source.html

+3

これは私には意味をなさない。キャストなしでNULLを任意のポインタに割り当てることができます。 –

答えて

8

割り当ての例では、明示的なキャストは有用な意味を持たない。しかし、あなたの質問は実際には#define NIL ((List *) NULL)マクロに関するもので、その使い勝手は割り当てを超えて広がっているようです。

variadic関数またはプロトタイプなしで宣言された関数に渡すのが理にかなっています。 NULLの標準は、0または0Lまたは((void *) 0)と定義することができます。これは、このようなタイプレスのコンテキストでは異なる解釈をする可能性があることを意味します。明示的なキャストは、それがポインタとして正しく解釈されることを確認します。

たとえば、これは一般的に無効である(動作は未定義である)

void foo(); 

int main() { 
    foo(NULL); 
} 

void foo(List *p) { 
    /* whatever */ 
} 

foo(NIL); 

とコールを交換し、それが有効になりながら。

4

はC

における構造体のポインタにキャストNULLのいずれかの利点があります

ありません。それは単にする必要があります:オブジェクトは(グローバル変数のように言う、)静的記憶を持っている場合

List *listPtr = NULL; 

また、あなたもNULLに初期化する必要はありません。

4

ヌルではない、あなたが得ることができるように、あなたはゼロがかなりnullだと思うかもしれませんが、それはnullに比べてピーナッツです。

+1

まだ、この新世代のHHGTTGファンは –

+0

ですが、残念ながらそうではありません。 'sizeof(NULL)'は 'NULL'がどのように定義されているかによって' 1'から '8'まで変化します。 –

+0

@ JensGustedtは、私たちの宇宙のNULLの表現です。 –

関連する問題