アカウント名:
パスワード:
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
UNIXはシンプルである。必要なのはそのシンプルさを理解する素質だけである -- Dennis Ritchie
NULLは0ではない (スコア:2, 興味深い)
標準C++がどんどんややこしくなっていく段階で脱落したのでID。
Re:NULLは0ではない (スコア:0)
実際の値は 00h 以外であっても構わない。
Re:NULLは0ではない (スコア:2, 参考になる)
だけど、C言語のレベルで扱っている限りは、処理系が変換してくれますよね。
union ptrint {
void *p;
unsigned int i; /* sizeof(int) == sizeof(void *)を仮定*/
} hoge;
hoge.p = NULL;
とかやったときにhoge.iが0にならん、という実装はアリだが、(int)NULLは常に0になるし、(void *)0はNULLと常に等価です。
問題になるとすればポインタを含む構造体をcalloc()で動的に確保したときかな、という程度の話でしょ?
Re:NULLは0ではない (スコア:1)
意味的に正しく使っているか、というところが重要じゃないでしょうか。
void mystrcpy(char *dst, const char *src)
{
void *terminator = 0;
while (*src != terminator) {
*dst++ = *src++;
}
*dst = terminator;
}
なんていうコードは、期待した通りに動くだろうけど、
変数 terminator の型を間違えてるのは明らか。で、同じことが
while (*src != NULL) {
なんてコードにも言えるかと。
ポインタでない数値 0 の代わりに NULL を使うことを是とする人には、
エンドオブファイルの意味ではない数値 -1 の代わりに
EOF を使うことを是とするのかどうか聞きたいです。
Re:NULLは0ではない (スコア:1, 参考になる)
EOFが-1であることは保証されていませんから(負であることが保証されているだけ)是とするはずがありません。
対して0がヌルポインタであることは保証されています。
Re:NULLは0ではない (スコア:1)
そうでしたか…ずっと覚え違いしてました…
うろ覚えついでにもう一つ書いてみますけど、
・整数定数 0 がヌルポインタ定数になることは保証されている
・ヌルポインタが整数0になることは保証されてない
んじゃありませんでしたっけ?
ヌルポインタの内部表現がビットパターンでオール0 じゃない環境とかでは
・void *p = (void*)0
pはヌルポインタ(0からヌルポインタの内部表現に変換)
・int a = 0; void *p = (void*)a;
pはヌルポインタではない(変換されない)
・void *p = (void*)0; int a = (int)p;
a = 0 とはかぎらない
といった感じで。