2

このコードでは:

int * p = new int(44);

pはヒープに割り当てられ、それが指す値は44です。しかし今、私はこのようなこともできます:

p[1] = 33;

エラーが発生することなく。いつも思っていた

int * p = new int(44);

「Pはヒープに割り当てられ、44を含むアドレスを指している」という別の言い方でしたが、どうやらそれはpaをintの配列へのポインターにしますか?この新しいアレイのサイズは44ですか?または、この結果は異常ですか。

4

3 に答える 3

5

正解です。Pはヒープに割り当てられ、44を含むアドレスを指します。配列は割り当てられていません。 p[1] = 33;彼らが「未定義動作」と呼んでいるものです。プログラムクラッシュする可能性がありますが、これを行うたびにクラッシュすることが保証されているわけではありません。

于 2012-10-17T00:22:23.363 に答える
0

あなたの例では、C++ 言語は、ポインターの添え字演算子のデフォルトの実装を提供します。これは、次のようになります。

(*Ptr)& operator[](size_t index)
{
   return *(address + index*sizeof(*Ptr));
}

これは、いつでもオーバーロードして、任意の型に置き換えることができます。あなたが言うとき、整数は例外ではありません:

int * pointer = alocate_int_array();
pointer[1] = 1;

その演算子のコンパイラで拡張されたデフォルトの実装を使用しています。

于 2012-10-17T00:31:10.017 に答える
0
int *p_scalar = new int(5); //allocates an integer, set to 5.

p_scalar[n] (n <> 0) にアクセスするとクラッシュする可能性があります

于 2012-10-17T00:24:22.067 に答える