[解決済み] C言語のポインタをNULLに初期化することは可能ですか?
質問
というようなことを書いていたのですが
char *x=NULL;
という前提で
char *x=2;
を作成すると
char
へのポインタはアドレス 2 になります。
しかし
GNU C プログラミングチュートリアル
には、次のように書かれています。
int *my_int_ptr = 2;
は整数値を格納します。
2
にある任意のランダムなアドレスに
my_int_ptr
に割り当てられます。
これはつまり、私自身の
char *x=NULL
の値が何であれ
NULL
にキャストしています。
char
はメモリ上のランダムなアドレスになります。
とはいえ
#include <stdlib.h>
#include <stdio.h>
int main()
{
char *x=NULL;
if (x==NULL)
printf("is NULL\n");
return EXIT_SUCCESS;
}
は、実際に、印刷します。
はNULL
をコンパイルして実行すると、未定義の動作、あるいは少なくとも規定外の動作に依存しているのではないかと心配になり、次のように書きます。
char *x;
x=NULL;
の代わりに
どのように解決するのですか?
<ブロッククオートC 言語のポインターを NULL に初期化することは可能ですか?
TL;DR はい、とても。
<ブロッククオート
一方、単一の初期割り当てだけを使用する場合。
int *my_int_ptr = 2;
で指されるメモリロケーションの内容を埋めようとします。
my_int_ptr
が指すメモリ位置の内容を値 2 で埋めようとする。このため
my_int_ptr
はゴミで埋まっているので、任意のアドレスにすることができます。[...]
さて、彼らは は は間違っている、あなたは正しい。
ステートメントについては、( は、ポインタから整数への変換は実装で定義された動作であるという事実を無視し )
int * my_int_ptr = 2;
my_int_ptr
は変数(のポインタ型)です。
int
へのポインタ)であり、それ自身のアドレス(タイプ:整数へのポインタのアドレス)を持っています。
2
の値を
その
のアドレスに変換します。
今すぐ
my_int_ptr
はポインタ型であるため、次のように言えます。
を指している
を指すと言えます。
によって指される
に保持されている値
my_int_ptr
. つまり、本質的に値
の
の値を代入しているのであって、ポインタが指すメモリ位置の値を代入しているわけではありません。
というわけで、結論から言うと
char *x=NULL;
ポインタ変数を初期化する
x
を
NULL
ではなく
の値ではなく、ポインターの指すメモリアドレスにある
.
これは と同じ として
char *x;
x = NULL;
拡張。
さて、厳密に準拠すると、次のような文になります。
int * my_int_ptr = 2;
は制約違反を含むため、違法です。はっきり言って
-
my_int_ptr
はポインタ変数で、型はint *
-
は整数の定数です。
2
は型がint
を持ちます。
で説明されているように、これらは "compatible" 型ではないので、この初期化は§6.5.16.1P1章で述べられている単純代入のルールに違反しているため、無効となります。 Lundin の回答 .
初期化が単純な代入制約にどのようにリンクされているかに興味がある人のために、引用します。
C11
章§6.7.9, P11
スカラのイニシャライザは,一つの式とし,オプションで中括弧で囲む。オブジェクトの初期値は オブジェクトの初期値は、(変換後の)式の値である。 と同じ型 単純な代入と同じ制約と変換が適用され、スカラの型は修飾されていないバージョンとみなされます。 の型は宣言された型の非限定版であるとします。
関連
-
[解決済み] 型付けされた関数ポインタ?
-
[解決済み] stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] HashMapを直接(リテラルに)初期化する方法は?
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] HashSetの値を構造的に初期化する方法は?
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
Cエラー [エラー] 代入_Ashesの左オペランドにlvalueが必要です-プログラマーズ・シークレット
-
C 言語のポインタ配列のポインタ型、ポインタに値を割り当てるために配列名を使用、コンパイル時の警告:互換性のないポインタ型からの初期化
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
-
[解決済み] Linuxカーネルにおけるcontainer_ofマクロの理解
-
[解決済み] C - Setデータ構造を実装するには?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み] フリーは、どのように無料化を知っているのですか?