0の値の代用としてNULLを使用することはできますか?
質問
を使用してもよいのでしょうか?
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
,
\0
と
0
を使用することが許され、また正しいのかどうか、私はそこから簡潔な情報を得ませんでした。
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を意味するのであれば、それはあなたが書くべきことです。
関連
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] JavaScriptでNULL、未定義、空白の変数をチェックする標準的な関数はありますか?
-
[解決済み] 変数が「未定義」または「NULL」であるかどうかを判断するにはどうすればよいですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] JavaScriptのnullとundefinedの違いは何ですか?
-
[解決済み] Pythonでnullオブジェクトを参照する
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】Enterキーを押して続行する
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] NULLと'ⅳ0'と'0'の違いは何ですか?