int *p;
*p=100;
cout<<*p;
これは正しいですか、それともエラーが発生するはずですか?
これにより、未定義の動作が呼び出されます。初期化されていないポインタを逆参照しています。ただし、未定義動作の結果の1つとして、コードが「機能」する場合があります。
ない。
これは正しくありませんが、C (または C++) 標準では、エラーが発生する必要があるという実装上の要件はありません。
C (または C++) の特定のものは「未定義の動作」です。つまり、標準は何が起こるかを気にしません。これはそれらの1つです。実装は、何かが間違っていることを伝えるために何らかの努力をするかもしれませんが、必須ではありません。未定義の動作を回避するのは (プログラマとしての) あなたの責任です。
構文的には問題ないように見えますが、もちろん、実行するだけで何が起こるかを知ることができます。
ただし、不明な場所(どこを指しているのかわからないp
)に値を格納しているため、結果の動作も不明(つまり未定義の動作)であると考えてください。
違います。
ポインタが保持する主な値は、ポインタが指しているメモリ位置のアドレスです。
ステートメント int *p は、p をポインターとして定義します。
変数を指すことによって初期化する必要があります。x としましょう。
初期化後、p を出力すると x のメモリアドレスが得られ、*p を出力すると x が保持している値が得られます。
いくつかの機能を実行する可能性がありますが、目的を果たさないことは間違いありません。
整数にいくらかのスペースを割り当てる必要があります。
すなわち
int *p = new int;
*p = 100;
cout << *p;
delete p;
これは、初期化されていない変数p
が指す場所に書き込むため、未定義の動作が原因で機能する場合と機能しない場合があります(問題がないと思われる場合は、機能しない場合があります)。ほとんどの場合、プログラムがクラッシュします。
適切なオプション(gccなど-Wall
)を備えた優れたコンパイラは、警告を表示します。
警告:「p」はこの関数で初期化されていない状態で使用されます