アカウント名:
パスワード:
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
日本発のオープンソースソフトウェアは42件 -- ある官僚
NULLと0 (スコア:1)
あと、NULL==0 という論理式の結果と、NULLが実際に何として定義されているかは別と言う話ではないか
written by こうふう
Re:NULLと0 (スコア:1)
NULLは0がヌルポインタであると明示するため,
#define NULL 0
されているだけです.時々,
#define NULL (void *)0
などもあるそうですが,これは間違いです.
確
Re:NULLと0 (スコア:1)
それはともかく、 C FAQ [catnet.ne.jp]によると、
#define ((void *)0)
は許されていると思いますが。(「べき」と書いたのは、私の思い違いです。)
まぁ、
#define NULL (void *)0
は、演算子の優先順位で駄目になるケースがあるかもしれないので、間違ってると言えるのかも。(具体的に、ありえそうでダメなケースをパッと思いつきませんが。。。)
あと、実装云々は、ここでは余計な
written by こうふう
Re:NULLと0 (スコア:1)
#define (void *)0
のところは完全に余計でした.すみません.
あと,==っていうのは,NULLとゼロを間違えてもいい,ということをどう表現しようかと考えて書いたんですが,確かにふさわしい表現じゃないような気がします.反省.
Re:NULLと0 (スコア:1)
以下、俺の理解をつらつらと書くので、間違ってたら突っ込んでください。
で、具体的にダメなケースは、プロトタイプ宣言の無い関数への引数の場合です。
(int)0がスタックに積まれるか、(ほにゃらら *)0がスタックに積まれるかは、違いがあるかも知れません。整数型と
written by こうふう
Re:NULLと0 (スコア:1)
int func(int hoge) {
...
}
プロトタイプ宣言無しに使われる時,
ret = func(NULL);
がマズくて
ret = func(0);
は,OKかもしれない.
-> 置き換えると結果が異なる.
ということですね.確かに.
# 具体的にはポインタ型がint型より長い場合かな?
ただ気になるのは,プロトタイプ宣言されていない関数の引数はint型と仮定されるはずなので,そこにNULLを入れ
Re:NULLと0 (スコア:1)
逆に、引数がポインタ型の場合、例えば、
int func(int *a){
...
}
に対して、プロトタイプ宣言なしに、
a = func(0);
はまずかろうと言う意味ですが。
(ただ、sizeof(int)==sizeof(int *)の処理系では、動作する?)
あと、このケースでは、
#define NULL 0
の処理系では、
a = func(NULL);
もまずいですね。。。プロトタイプ宣言をちゃんとするか、適切にキャストしてやるしかないのだろうなぁ。。。
a = func((int *)NULL);
b
written by こうふう
Re:NULLと0 (スコア:1)
ということは,
func((void *)0);
としなければならない状況はあると.
そのときは当然,NULLも
func((void *)NULL);
としなければならないですね.
じゃあやっぱり,0とNULLは置き換えられる?
なんか嘘クサイ...
Re:NULLと0 (スコア:1)
だから、禁じ手の方の表現がおかしくて、「0とヌルポインタを混同する」のが問題で、「0とNULLを同一視する」のは問題ないとすべきなのかも。
まぁ、ちゃんとコーディングしていれば、 0 と (void *)0 が別物だってのは分かると思うのだけど。その辺を混同するなよという話なのかも。
written by こうふう
Re:NULLと0 (スコア:1)
> その辺を混同するなよという話なのかも。
そうですね,そんなところかもしれません.
プロトタイプ宣言無しはともかく,可変引数を使う事はありそうなんで,気をつけるようにしたいですね.