
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の基本の「動的に確保した配列変数の実体は、単なるポインタである」っての忘れてませんか?
ご回答をありがとうございます!
Cの把握があいまいなためか、配列変数の仕様について、理解が薄くありました。
配列はメモリを確保しても、あくまでポインタなのですね。
しかし、配列でなく変数で宣言しても、最終的に配列として使いたい場合は、後からnewで宣言しても、
ポインターとしてしかならないのですよね。
まさか配列と同じ数の変数を、ベタ書きで宣言はできないので、別の手段を作るのは難しそうです。
その辺をもうちょっと勉強して、理解を深めたいと思います。
本当に、詳しい説明をありがとうございました。
全くそういった発想ができないほど、自分がC言語を理解していないということが目に見えて分かりましたので、助かりました。
No.2
- 回答日時:
> mallocと違うのは「関数から抜ける際に、自動的にdeleteされる」ってだけ。
ダウト。
違うという意味では、コンストラクタが呼ばれるとか、
std::bad_allocの可能性があるとか、いろいろありますが、
mallocをnewにしても自動でdeleteされたりはしません。
# だから、std::auto_ptrとかがあるわけです。
ご回答ありがとうございます。
現在、stdを使わず、完全に.NETのものだけで組んでいるため、C++固有の表記があまり理解しておりません…。
いずれ必要になる知識だと思いますので、参考にさせていただきたく思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
隣の枝がはみ出してきたら切ってもいい?最もやってはいけないことは?
「隣の木が越境してきて困るが、勝手に切ってはいけないと聞くし…」そう思っている方も多いだろう。実は、2023年4月1日に民法が改正され、この「越境枝」のルールが大きく変わった。 教えて!gooでも「境界から出て...
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列の要素数に変数を入れたい...
-
C++:構造体:newで入れ子:del...
-
関数から配列を返すには?
-
MFCのCArrayを使った二次元配列
-
define で 配列
-
CStringからchar*への型変換に...
-
Integer変数をカラにしたいので...
-
VBAのプログラムで、DIAG = 1# ...
-
LPSTR型の初期化について
-
ヘッダーファイルからの取り込...
-
指定したメモリアドレスの値の...
-
C言語でのconstを返す関数
-
C# 配列の変数宣言について。
-
セグメントエラー
-
C# Listを使わずに2次元配列の...
-
WSH(VBS)でJSONの文字列を読み...
-
char 文字列型 の表現範囲が-12...
-
アプリを32bitから64bit移行
-
ファイルの読み込みとメモリ確...
-
C言語 配列の長さの上限
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
c言語
-
c言語プログラミング 等差数列...
-
define で 配列
-
配列の要素数に変数を入れたい...
-
C言語 ファイルの指定された行...
-
int i, int i[1];
-
C#で構造体の配列を持った構造...
-
C言語において、 配列要素をひ...
-
C言語から質問です。
-
C#でのフィボナッチ数列
-
c言語 構造体
-
MFC - ダイアログボックスのPic...
-
構造体のextern方法
-
fclose()でセグメンテーション違反
-
C言語の課題が出たのですが自力...
-
2番目の最大値を求める
-
MFCのCArrayを使った二次元配列
-
const で宣言してるのに、値が...
-
配列の不正アクセスについて
おすすめ情報