3

次のコードを検討してください。

int *p = new int;
cout << sizeof(*p);
delete p;

予想どおり、結果は 4 です。次に、次の別のコードを考えてみましょう。

int *p = new int[10];
cout << sizeof(*p);
delete[] p;

40 (割り当てられた配列のサイズ) を取得することを期待していましたが、結果はまだ 4です。

ここで、または でint *foo()作成された構造体へのポインターを返す関数があるとします(ただし、どれかはわかりません)。newnew[]

int *p = foo();

p私の質問は、単一の整数または整数の配列を指しているかどうかを知る方法 (またはハック)はありますか?

これは単なる理論的な質問であることを覚えておいてください。この方法で実際のコードを書くつもりはありません。

4

7 に答える 7

4

いいえ、それを行う方法はありません。しかし、あなたnewが書いたコードはorを呼び出したので、違いがわかりますnew[]

ちなみに理由は:

 cout << sizeof(*p);

p は int へのポインターであり、式 *p はそのようなポインター (つまり int) が指すものを意味し、プラットフォーム上の int のサイズは 4 であるため、どちらの場合も 4 が返されます。これはすべて評価されます。そのためnew[]、特別な値が返されたとしても、それsizeofを使用することはできません。

于 2011-06-03T15:44:01.727 に答える
3

いいえ、結果はアドレスであるためです (そのため、両方の場合で sizeof() の値が 4 になります)。あなたはそれを作成したので、それが何であるかを知っているはずです。

于 2011-06-03T15:47:00.217 に答える
2

どちらの例でも、p の型は同じです: int *. sizeof は、データではなく型で動作します。コンパイル時に計算されます。

いくつかの選択肢があります。配列のサイズを自分で追跡することも、vector< int > などの標準ライブラリのコンテナーの 1 つを使用することもできます。これらのコンテナは、サイズ (例: vector< int >::size()) を追跡します。

于 2011-06-03T15:47:48.897 に答える
2

sizeof(x) は、宣言された x を格納するために必要なメモリ量を返します。

これには動的な側面はまったくありません。

foo が a である sizeof (*foo)bar *は常にsizeof(bar)

于 2011-06-03T15:48:35.220 に答える
1

いいえ、仕方がありません。

必須の質問: なぜ知る必要があるのですか?

それが「かどうかを知る必要があるため」のdelete []場合delete、何らかの理由で自分のコードでどちらを使用したかがわからない場合は、常に配列を使用してください。

于 2011-06-03T15:44:05.737 に答える
1

単一のアイテムまたは配列へのポインターを返すことができる関数を持つことは、設計上の決定として不適切です。サイズ 1 の配列へのポインターをいつでも返すことができます。

return new int[1];
于 2011-06-03T15:48:33.567 に答える
0

まず、sizeof(*p)常に整数に値を返すため、常に4を返します。

pでは、 が を指しているのか、 を指しているのかをどのように知ることができますintint[]?

標準的な方法はありません。ただし、プラットフォームをハッキングして知らせることはできます。たとえば、p[-1], p[-2], ..., p[-4] etc.特定のコンパイラ (私の場合は Linux など) で印刷しようとすると、この場所の値に特定のパターンが表示されます。ただし、これは単なるハックであり、常に信頼できるとは限りません。

于 2011-06-03T16:54:28.560 に答える