• ベストアンサー

.NET C++で、構造体の配列をnewで作成しようとするとerror C2440のエラーとなってしまいます

Visual studio2003 .NET C++で、構造体の配列を作成し、 改めて構造体の配列をサイズ指定して作成しようとすると、error C2440が出てしまいます。 ポインターで宣言したつもりはないのですが、ポインターから配列に変換できないといった項目のエラーなので、 なぜこのようなエラーが出るのかわからずにおります。 typedef __nogc struct TEST { // 省略 }; TEST struct_test __nogc[]; int int_num = 10; struct_test = new TEST __nogc[int_num]; // error C2440: '=' : 'TEST *' から 'TEST []' に変換できません。 ご指摘等ありましたらご回答いただけますと助かります。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

new文の実体は「ヒープメモリからメモリを確保し、その先頭アドレス、つまり、ポインタを返す」なのだから、受け手はポインタじゃないとならない。 要は「やってる事はmallocと一緒」な訳。 mallocと違うのは「関数から抜ける際に、自動的にdeleteされる」ってだけ。 >ポインターで宣言したつもりはないのですが、ポインターから配列に変換できないといった項目のエラーなので、 >なぜこのようなエラーが出るのかわからずにおります。 「質問者さんが配列で宣言しちゃったから」に他なりません。 質問者さんは、以下のような記述がOKだと考えますか? int main(void) { char buf[]; buf = new char[1000]; buf[0] = 'a'; buf[999] = '\0'; } では、これは? int main(void) { char buf[]; char *p; p = new char[1000]; buf = p; buf[0] = 'a'; buf[999] = '\0'; } では、これは? int main(void) { char *buf; buf = new char[1000]; buf[0] = 'a'; buf[999] = '\0'; } じゃあ、最後。これは? #include <略> int main(void) { char *buf; buf = malloc(sizeof(char) * 1000); buf[0] = 'a'; buf[999] = '\0'; free(buf); } Cの基本の「動的に確保した配列変数の実体は、単なるポインタである」っての忘れてませんか?

noname#95407
質問者

お礼

ご回答をありがとうございます! Cの把握があいまいなためか、配列変数の仕様について、理解が薄くありました。 配列はメモリを確保しても、あくまでポインタなのですね。 しかし、配列でなく変数で宣言しても、最終的に配列として使いたい場合は、後からnewで宣言しても、 ポインターとしてしかならないのですよね。 まさか配列と同じ数の変数を、ベタ書きで宣言はできないので、別の手段を作るのは難しそうです。 その辺をもうちょっと勉強して、理解を深めたいと思います。 本当に、詳しい説明をありがとうございました。 全くそういった発想ができないほど、自分がC言語を理解していないということが目に見えて分かりましたので、助かりました。

その他の回答 (1)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.2

> mallocと違うのは「関数から抜ける際に、自動的にdeleteされる」ってだけ。 ダウト。 違うという意味では、コンストラクタが呼ばれるとか、 std::bad_allocの可能性があるとか、いろいろありますが、 mallocをnewにしても自動でdeleteされたりはしません。 # だから、std::auto_ptrとかがあるわけです。

noname#95407
質問者

お礼

ご回答ありがとうございます。 現在、stdを使わず、完全に.NETのものだけで組んでいるため、C++固有の表記があまり理解しておりません…。 いずれ必要になる知識だと思いますので、参考にさせていただきたく思います。

関連するQ&A