🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

447閲覧

二次元配列を関数の引数に渡して値を代入しようとすると例外がスローと出る

20020120

総合スコア9

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/03/18 09:28

編集2021/03/18 09:32

使用ツールはvisualstudio 言語はC・C++です。
起きている問題はタイトルの通り、関数の引数として二次元配列の先頭アドレスを渡し、for文を使ってそこに値を代入したいです。

前提・実現したいこと

C・C++を使ってゲームのセーブ・ロード機能を作っています。
そのロード機能の実装中に下記のエラーが出ました。

発生している問題・エラーメッセージ

0x00D160A1 で例外がスローされました (gp1.exe 内): 0xC0000005: 場所 0x006421A0 への書き込み中にアクセス違反が発生しました

該当のソースコード

C・C++

1void Load_Common(const char* name, char mapDat[BG::CHIP_NUM_Y][BG::CHIP_NUM_X]) 2 char rhs[BG::CHIP_NUM_Y * BG::CHIP_NUM_X] = {}; 3 ifstream read; 4 read.open(name); 5 read.read((char*)&rhs, sizeof(int) * (BG::CHIP_NUM_Y * BG::CHIP_NUM_X)); 6 read.close(); 7 8 for (int i = 0; i < BG::CHIP_NUM_Y; i++) 9 { 10 for (int j = 0; j < BG::CHIP_NUM_X; j++) 11 { 12 mapDat[i][j] = rhs[i * BG::CHIP_NUM_X + j]; 13       「ここで例外がスローされる」 14 } 15 } 16 17}

試したこと

配列の初期化忘れをしていないか確認

補足情報(FW/ツールのバージョンなど)

//-----------------------------------補足-----------------------------------------//
BG::CHIP_NUM_Xは定数
渡される配列はシングルトンパターンを利用したクラスの2次元配列
下記はその宣言
class sendData /シングルトンパターン/
{
public:
//変数****
char overmap[BG::CHIP_NUM_Y][BG::CHIP_NUM_X] = {};
char undermap[BG::CHIP_NUM_Y][BG::CHIP_NUM_X] = {};
char overgimmick[BG::CHIP_NUM_Y][BG::CHIP_NUM_X] = {};
char undergimmick[BG::CHIP_NUM_Y][BG::CHIP_NUM_X] = {};
省略
}

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

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

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

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

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

guest

回答2

0

ベストアンサー

とりあえずひとつ

char rhs[BG::CHIP_NUM_Y * BG::CHIP_NUM_X] = {}; read.read((char*)&rhs, sizeof(int) * (BG::CHIP_NUM_Y * BG::CHIP_NUM_X));

rhs のサイズは sizeof(char) * (BG::CHIP_NUM_Y * BG::CHIP_NUM_X) なのに sizeof(int) * (BG::CHIP_NUM_Y * BG::CHIP_NUM_X) バイト書き込んでいるので、スタックを破壊しています。

投稿2021/03/18 09:50

yuki23

総合スコア1448

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

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

20020120

2021/03/18 11:47

ありがとうございます コードの見直しが甘かったです。うまく実装することができました
guest

0

これはその関数ではなく、関数を呼び出す側がタコっています

投稿2021/03/18 09:46

y_waiwai

総合スコア88038

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問