[解決済み] NULLと'ⅳ0'と'0'の違いは何ですか?
質問
C言語では、さまざまなゼロの値に違いがあるように見えますが --。
NULL
,
NUL
と
0
.
私は、ASCII文字
'0'
は、次のように評価されます。
48
または
0x30
.
は
NULL
のポインタは、通常、次のように定義されます。
#define NULL 0
または
#define NULL (void *)0
さらに
NUL
文字
'\0'
と評価されるようです。
0
と同じです。
この3つの値が等しくならないことはあるのでしょうか?
これは64ビットシステムでも同じですか?
解決方法は?
注意事項 この回答はC言語に適用され、C++には適用されません。
ヌルポインター
整数の定数リテラル
0
は、使用される文脈によって異なる意味を持ちます。どのような場合であっても、それは値
0
ただ、記述の仕方が違うだけです。
ポインタが定数リテラルと比較される場合
0
であれば、これはポインタがヌルポインタであるかどうかのチェックである。これは
0
は、ヌルポインター定数と呼ばれます。C言語規格では、以下のように定義されています。
0
型にキャストします。
void *
はヌルポインタとヌルポインタ定数の両方です。
さらに、可読性を高めるために、マクロ
NULL
は、ヘッダーファイル
stddef.h
. お使いのコンパイラによっては
#undef NULL
というように、何かおかしなものに再定義してください。
そこで、NULLポインタをチェックする有効な方法をいくつか紹介します。
if (pointer == NULL)
NULL
はヌルポインタと等しいかどうかを比較するために定義されています。 の実際の定義が何であるかは、実装で定義されています。
NULL
は、有効なヌルポインタ定数である限り、有効です。
if (pointer == 0)
0
はヌルポインタ定数の別の表現です。
if (!pointer)
これは
if
文は暗黙のうちに "is not 0" をチェックしているので、これを逆にして "is 0" を意味するようにします。
以下は、NULLポインタのチェック方法として無効なものです。
int mynull = 0;
<some code>
if (pointer == mynull)
コンパイラにとっては、これはNULLポインタのチェックではなく、2つの変数の等価チェックなのです。これは かもしれない しかし、これは保証されたものではなく、コンパイラはC標準に従って少なくとも1つの診断メッセージ(警告またはエラー)を出さなければならないのです。
C言語におけるヌルポインタの値は、基礎となるアーキテクチャには関係ないことに注意してください。もし、基礎となるアーキテクチャがヌルポインタの値をアドレス 0xDEADBEEF と定義しているならば、この混乱を解決するのはコンパイラ次第です。
このように、おかしなアーキテクチャであっても、ヌルポインタをチェックする方法としては、以下の方法が有効です。
if (!pointer)
if (pointer == NULL)
if (pointer == 0)
以下は、NULLポインタをチェックするための無効な方法です。
#define MYNULL (void *) 0xDEADBEEF
if (pointer == MYNULL)
if (pointer == 0xDEADBEEF)
これらはコンパイラからは通常の比較とみなされるからです。
ヌル文字
'\0'
はヌル文字と定義される。つまり、すべてのビットがゼロに設定された文字である。
'\0'
は(他の文字リテラルと同様に)整数定数であり、この場合は値が0である。 つまり
'\0'
とは完全に等価であり、飾り気のない
0
整数定数で、唯一違うのは
意図
というように、読み手に伝えることができます("私はこれをヌル文字として使っています")。
'\0'
はポインタとは関係ありません。しかし、このコードと似たようなものを目にすることがあるかもしれません。
if (!*char_pointer)
は、char ポインタが NULL 文字を指しているかどうかをチェックします。
if (*char_pointer)
は、char ポインタが非 NULL 文字を指しているかどうかをチェックします。
ヌルポインターと混同しないようにしましょう。ビット表現が同じであるため、便利なクロスオーバーのケースがありますが、実際には同じものではありません。
参考文献
参照 comp.lang.cのFAQの質問5.3です。 をご覧ください。 参照 このPDF はC言語規格です。6.3.2.3項 ポインターの項をチェックしてみてください。
関連
-
関数 'malloc' の暗黙の宣言に対する解決策
-
[解決済み] C言語の書式指定子 %ul と %lu の違いは何ですか?
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] JavaScriptでNULL、未定義、空白の変数をチェックする標準的な関数はありますか?
-
[解決済み] 変数が「未定義」または「NULL」であるかどうかを判断するにはどうすればよいですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] JavaScriptのnullとundefinedの違いは何ですか?
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] nullはなぜオブジェクトなのか、nullとundefinedの違いは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
_CRT_SECURE_NO_WARNINGS エラーメッセージ、解決方法
-
未定義の `__isoc99_sscanf' への参照
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] なぜmemsetではなくbzeroを使用するのですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] 演算子 *, /, +, -, % を使わずに 3 で割る。
-
[解決済み] C言語でランダムなint型を生成するには?
-
[解決済み] なぜsizeof(x++)はxをインクリメントしないのですか?