1. ホーム
  2. c++

0の値の代用としてNULLを使用することはできますか?

2023-07-25 07:09:26

質問

を使用してもよいのでしょうか? NULL の値の代わりにポインタを使ってもいいのでしょうか? 0 ?

それとも、そうすることに何か問題があるのでしょうか?


例えば、こんな感じです。

int i = NULL;

の代わりとして。

int i = 0;


実験として、以下のコードをコンパイルしてみました。

#include <stdio.h>

int main(void)
{
    int i = NULL;
    printf("%d",i);

    return 0;
}

出力します。

0

確かにこの警告は出ますが、それ自体は完全に正しいです。

warning: initialization makes integer from pointer without a cast [-Wint-conversion] 

となっていますが、結果はやはり同等です。


  • 私はこれで "未定義の動作に交差しているのでしょうか?
  • この場合 NULL をこのように利用することは許されるのでしょうか?
  • を使用することに何か問題がありますか? NULL を算術式の数値として使用することに何か問題がありますか?
  • また、この場合、C++ではどのような結果、動作になるのでしょうか?

の回答を読ませていただきました。 NULL、'ⅳ0'、0'の違いは何ですか? との違いについて NULL , \00 を使用することが許され、また正しいのかどうか、私はそこから簡潔な情報を得ませんでした。 NULL を代入や他の算術演算をするための値として使うことが許され、また正しいのかどうか。

どのように解決するのですか?

<ブロッククオート

NULLポインタを0に置き換えて使用してもよいのでしょうか?

いいえ は、そうするのは安全ではありません。 NULL はヌルポインタの定数で、これは という型を持っています。 int を持つこともできますが、より一般的なタイプは void * (Cの場合)であるか、さもなければ直接 int (に直接代入できない場合(C++の場合 >= 11)。 どちらの言語もポインタを整数に変換することはできますが、暗黙のうちに変換することはできません(ただし、拡張機能としてそれを提供するコンパイラもあります)。 また、NULLポインタを整数に変換すると値0になるのが一般的ですが、標準ではそれを保証していません。 もしあなたが,型 int という型と値 0 を持つ定数が欲しい場合は、次のように綴ります。 0 .

  • この場合、未定義の動作に入り込む可能性がありますか?

はい。 NULL という型を持つ値に展開されます。 void * などの直接代入不可能な値を int . 標準では、このような実装での代入の動作は定義されていませんので、その動作は未定義です。

  • はそのような方法で NULL を操作することは許されるのでしょうか?

それは貧しいスタイルであり、あるシステムとある状況下では壊れます。 あなたがGCCを使用しているように見える以上、あなた自身の例では -Werror オプションでコンパイルした場合、あなた自身の例では壊れるでしょう。

  • 演算式でNULLを数値として使用することは問題ないでしょうか?

数値であることは全く保証されていません。 もし0を意味するのであれば、0と書くと定義が明確であるだけでなく、短くてわかりやすいでしょう。

  • で、その場合のC++での結果はどうなんでしょうか?

C++言語はC言語よりも変換に厳しく、異なるルールで NULL に対して異なる規則がありますが、そこでも実装が拡張を提供することがあります。 繰り返しますが、もしあなたが0を意味するのであれば、それはあなたが書くべきことです。