アプリ版:「スタンプのみでお礼する」機能のリリースについて

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 []' に変換できません。

ご指摘等ありましたらご回答いただけますと助かります。
よろしくお願いいたします。

A 回答 (2件)

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の基本の「動的に確保した配列変数の実体は、単なるポインタである」っての忘れてませんか?
    • good
    • 0
この回答へのお礼

ご回答をありがとうございます!
Cの把握があいまいなためか、配列変数の仕様について、理解が薄くありました。
配列はメモリを確保しても、あくまでポインタなのですね。
しかし、配列でなく変数で宣言しても、最終的に配列として使いたい場合は、後からnewで宣言しても、
ポインターとしてしかならないのですよね。
まさか配列と同じ数の変数を、ベタ書きで宣言はできないので、別の手段を作るのは難しそうです。

その辺をもうちょっと勉強して、理解を深めたいと思います。
本当に、詳しい説明をありがとうございました。
全くそういった発想ができないほど、自分がC言語を理解していないということが目に見えて分かりましたので、助かりました。

お礼日時:2009/06/30 09:40

> mallocと違うのは「関数から抜ける際に、自動的にdeleteされる」ってだけ。



ダウト。
違うという意味では、コンストラクタが呼ばれるとか、
std::bad_allocの可能性があるとか、いろいろありますが、
mallocをnewにしても自動でdeleteされたりはしません。
# だから、std::auto_ptrとかがあるわけです。
    • good
    • 1
この回答へのお礼

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

お礼日時:2009/06/30 09:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!