質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1327閲覧

構造体の二重ポインタについて

ibuki

総合スコア15

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/10/17 02:14

編集2017/10/18 07:51

C++の構造体の二重ポインタによる二重配列について

構造体の二重ポインタを二重配列のように使い、x軸y軸行列のように並んでいるようなイメージのデータを作成したいと思っています。
以下のように書いたところ、ST[0][0].a = 111;としようとしたときに
System.AccessViolationException: '保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。'
というエラーが出たので、メモリを確保する必要があるのかと思い、
ST = new StructTest*[10];
というようにするのかなと思って模索していますが同様のエラーになります。
どのようにメモリ確保すればよろしいでしょうか。

lang

1public value struct StructTest { 2public: 3 int a; 4 int b; 5 int c; 6}; 7 8VOID TEST() 9{ 10 StructTest ** ST; 11 ST = new StructTest*[10]; 12 for (int i = 1; i <= 10; i++) { 13 for (int j = 1; j <= 10; j++) 14 { 15 int x = (i * 100) + (j * 10); 16 ST[i][j].a = x + 1; 17 ST[i][j].b = x + 2; 18 ST[i][j].c = x + 3; 19 } 20 } 21}

環境はWin10のVS2017でC++CLIです。

追記
すみません、上記のループ部分は試行錯誤中のテスト記述のままでした。
実際には以下のように書いています。
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

二重ポインタなので、StructTest*を入れるスペースとは別に、StructTest自体を入れるスペースを確保する必要があります。

C++

1ST = new StructTest*[10]; 2for(int i = 0; i<10; ++i){ 3 ST[i] = new StructTest[10]; 4}

あと、C++では配列は0始まりなので、[10]で確保した場合に読み書きできるのは0~9までです(10は範囲外になります)。

投稿2017/10/17 02:27

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ibuki

2017/10/17 02:41

迅速なご回答ありがとうございます。 私も一度同じようにしようと思ったのですが、 ST[i] = new StructTest[10]; の部分で、以下のコンパイルエラーが発生します。 エラー (アクティブ) E2022 マネージ クラスの配列は使用できません 使用言語は正確にはC++CLIなのですが、その辺の問題でしょうか?
maisumakun

2017/10/17 02:43

そうですね(残念ながら、C++/CLIについてはよくわからないです)
ibuki

2017/10/18 05:28 編集

上記について、C++CLIのせいかは分かりませんが、マネージ型の構造体として使用するために public value struct StructTest { としているので、その「value」のせいで 「エラー C2728 'StructTest': ネイティブ配列はこの型を含むことはできません」 「エラー (アクティブ) E2022 マネージ クラスの配列は使用できません」 が発生しているようでした。 マネージ クラスの構造体で配列を作る方法が分からないので、調査中です。
guest

0

自己解決

StructTestを入れるスペースについて、
ST[i] = new StructTest[10];
ではなく
ST[i] = new StructTest;
とすることで確保できたかと思います。
全体としては、以下のようになりました。

lang

1public value struct StructTest { 2public: 3 int a; 4 int b; 5 int c; 6}; 7 8VOID TEST() 9{ 10 StructTest ** ST; 11 ST = new StructTest*[10]; 12 for (int i = 0; i < 10; i++) { 13 ST[i] = new StructTest;//StructTestを入れるスペースを確保 14 for (int j = 0; j < 10; j++) 15 { 16 int x = ((i+1) * 100) + ((j+1) * 10); 17 ST[i][j].a = x + 1; 18 ST[i][j].b = x + 2; 19 ST[i][j].c = x + 3; 20 } 21 } 22}

投稿2017/10/18 08:02

ibuki

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問