私がする場合の違いは何ですか
int *i = new int;
*i = 5;
*(i+1) = 20;
と
int *i2 = new int [2];
i2[0] = 5;
i2[1] = 20;
これら 2 つのポインターに同じ方法でアクセスして使用できますが、これら 2 つの例の違いと、最初の例のように十分なメモリを割り当てないと発生する可能性のあるエラーは何ですか?
違いは、未定義の動作を呼び出す最初のものです。プログラムのクラッシュ、データの破損、または単に「機能している」など、あらゆることが起こる可能性があります。
最初のオプションは、割り当てられていないメモリに書き込みます。これにより、クラッシュなどの予期しない動作が発生する可能性があります。
アクセスする要素に違いはありません。構文*(i+1)
(ポインター表記) とi[1]
(配列要素アクセス表記) は同じです。この場合、ポインターと配列は同等と考えることができます (したがって、同じ要素にアクセスする 2 つの方法があります)。
他の人が述べたように、適切に割り当てられていないメモリにアクセスしようとすると、未定義の動作が発生します。
最初のケースでは、1 つの整数にメモリを割り当てました。したがって、動作が未定義の次の場所に移動する *(i+1) は実行できません。つまり、すぐにまたは後でクラッシュする可能性があります。
後のケースでは、2 つの整数にメモリを割り当てています。
最も可能性が高いのはデータの破損ですが、一般的には未定義です。