イマドキのCやC++でヌルポインタってどう扱うの?

「そう言えばポインタとヌルポインタの比較ってどう書くのがベターなのかしらん?」と、小生が軽い気持ちで呟いた一言が、今宵も多くのプログラマのハートに火をつけたのであった… 目の前にある問題を解かずにはいられない…それがプログラマ…! わざわざ返信して頂いた諸先輩方、本当にありがとうございます。
4
西山 信行 @5mingame2

実は assert(ptr) ではなく assert(ptr != NULL) がベターなのかしらん…?

2011-03-09 23:11:51
NANJI Kazunori @torotiti

true は !=0 であり、C++の場合、NULLより0を使うべきなので前者が良いかと RT @5mingame2: 実は assert(ptr) ではなく assert(ptr != NULL) がベターなのかしらん…?

2011-03-09 23:23:19
西山 信行 @5mingame2

@torotiti 情報ありがとうございます。組み込み系だとNULLポインタが0以外の場合も見受けられるのですが…そういう場合でもC++で !ptr と書いて問題ない感じでしょうか?

2011-03-09 23:28:35
西山 信行 @5mingame2

どうやら C++ではポインタと0を比較する場合に、0がヌルポインタを指し示すように変換されてコンパイルされるらしい…恐るべしC++…!

2011-03-09 23:36:24
NANJI Kazunori @torotiti

@5mingame2 0自体が、任意のヌルポに変換されることが保証されているので、もしそういう処理系のコンパイラなら、適切な内容に変換されるはず。たぶん。

2011-03-09 23:37:01
hira @hira_kuni_45

@5mingame2 @torotiti 「NULL」はあくまでもC言語用マクロであって、C++では「0」と比較するのが正しいと教わりましたが、そもそもassertを使わないで例外を投げる方がスマートな気がします・・、assertを使うメリットも微妙にあるかもしれないけど・・

2011-03-09 23:40:45
後藤 浩昭 / GORRY @gorry5

@5mingame2 1980年代にあった最初のCからそうだと思いますが… :D

2011-03-09 23:40:45
西山 信行 @5mingame2

ヌルポインタの扱いがCとC++で違うのが徐々に見えてきた。今度先生に質問してみんべ。なるべく移植性のあるコードを書きたいがこなへんが限界か…!

2011-03-09 23:41:33
まる @maruru_h

@5mingame2 ストロヴストルップ先生が「別に困ったことないよ」と言ってそういう仕様になっていますね。(void*)0とするわけにはいかなかったからだけど。私はNULLではなく0派。

2011-03-09 23:44:29
まる @maruru_h

@5mingame2 補足。Cでも別に変わらんみたいですよ。 http://bit.ly/htdIIt

2011-03-09 23:49:02
西山 信行 @5mingame2

なんと…不勉強で申し訳ない気持ちで一杯です(汗 QT @gorry5 1980年代にあった最初のCからそうだと思いますが… :D

2011-03-09 23:49:03
西山 信行 @5mingame2

情報ありがとうございます!これは明日から対処せねば…ヌルポインタは0と書く! RT @maruru_h 補足。Cでも別に変わらんみたいですよ。 http://bit.ly/htdIIt

2011-03-09 23:51:40
西山 信行 @5mingame2

@hira_kuni_45 assertはCのコードをC++でも使い回す例えです。C++の例外等はまだまったく知らないので(汗 Cでもヌルポインタは0と書けばいいみたいですね。びっくし。

2011-03-09 23:54:15
後藤 浩昭 / GORRY @gorry5

@5mingame2 実際、昔は「ヌルポインタが0番地でない」実装のものがあったそうなので…そういう環境でも「ポインタへの0の代入や比較はその環境でのヌルポインタとする」と

2011-03-09 23:55:01
西山 信行 @5mingame2

@torotiti いま大量のお叱りリプライに埋もれてます(汗 CでもC++でも、ヌルポインタは「0」と書けばコンパイラが正しく解釈してくれ、!ptrなどの比較演算も問題ないと今更ながら理解しました! ツイッター有り難い…

2011-03-09 23:56:51
DARL @DARL_Japan

@gorry5 @5mingame2 その話は昔見ましたが、一体、どんな環境なのか見てみたい。0xFFFFとか?

2011-03-09 23:57:56
西山 信行 @5mingame2

@gorry5 なんら疑問を持たずにNULLマクロを使っていましたが… ヌルポインタとしての0をCもC++も適切に解釈してくれるという感じだったのですね!これから可搬性の高いコードを維持できそうです。 となるとむしろ微妙なのはNULLマクロ…?!

2011-03-09 23:59:16
西山 信行 @5mingame2

@DARL_Japan 気になりますよね。私もずっと調査中なのですが、まだ出会った事がありません。

2011-03-10 00:01:00
hira @hira_kuni_45

@5mingame2 そんな事は無いと思う、C言語では、NULLが常に「0」のエイリアスとは限らない(とあるプロセッサ{DSPなどに多い}では0x8000などになっている) QT Cでもヌルポインタは0と書け

2011-03-10 00:01:12
圡本 強 @117Florian

@DARL_Japan @gorry5 @5mingame2 ANSI-CでNULLは0に統一されたと思います。DEC-VAXだったかなぁ、0じゃない環境。さすがに触ったこと無いです。

2011-03-10 00:03:23
西山 信行 @5mingame2

@hira_kuni_45 Wikiやこのページを見る限り、Cでも文脈上「0」と書けばヌルポインタとして扱われ、コンパイル時に適切な値に変換される雰囲気ですが…どうでしょうか http://bit.ly/htdIIt

2011-03-10 00:04:49
後藤 浩昭 / GORRY @gorry5

@DARL_Japan @117Florian @5mingame2 Cコンパイラを裸(標準マクロなし)で使うことは一般的にはほとんどないと思うので、素直に標準マクロのNULL定義を利用するのが結局いちばんポータブルなのではないかと

2011-03-10 00:09:49
西山 信行 @5mingame2

@gorry5 そうなると、私の最初の話に戻りませんか? ptr != NULL という表記が延々生き残ってしまうという…

2011-03-10 00:12:41
marvelph @marvelph

@5mingame2 逆だと思いますよ。ポインタに参照無しは0と書くのが本来で、NULLは単なるマクロです。

2011-03-10 00:22:00