8

C で構造体ポインタに NULL をキャストする利点はありますか?

例えば:

typedef struct List
{
....
} List;

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

PostgreSQL ソースからの例:

#define NIL                     ((List *) NULL)

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

4

3 に答える 3

10

割り当ての例では、明示的なキャストは意味がありません。しかし、あなたの質問は実際には#define NIL ((List *) NULL)マクロに関するものであり、その使いやすさは代入を超えているようです。

意味のある場所の 1 つは、可変引数関数またはプロトタイプなしで宣言された関数に渡す場合です。標準は、またはまたはまたはその他の方法でNULL定義できます。つまり、そのような型のないコンテキストでは異なる解釈がされる可能性があります。明示的なキャストにより、ポインターとして正しく解釈されることが保証されます。00L((void *) 0)

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

void foo();

int main() {
  foo(NULL);
}

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

呼び出しを

foo(NIL);

有効にします。

于 2012-08-23T14:47:12.800 に答える
6

null は null ではありません。取得できる限り null です。ゼロはかなり null だと思うかもしれませんが、それは null と比較すると単なるピーナッツです。

于 2012-08-23T14:41:28.787 に答える
4

Cの構造体ポインタにNULLをキャストする利点はありますか

ありません。それは単純である必要があります:

List *listPtr = NULL;

さらに、オブジェクトに静的ストレージがある場合 (たとえば、グローバル変数のように)、NULL に初期化する必要さえありません。

于 2012-08-23T14:41:24.963 に答える