アクセス違反の原因が分かりません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
wasawasa
記事: 94
登録日時: 11年前

アクセス違反の原因が分かりません

#1

投稿記事 by wasawasa » 11年前

フォルダのパスと画像ファイル名をchar変数に格納し、それらをstrcatで結合した文字列をファイルのパスとして画像を呼び出すプログラムを組んでデバッグしたところアクセス違反が発生してしまいました。

作成したプログラムの大まかな構造は以下の通りです

コード:

#include "DxLib.h"
int img[100];
struct card{
	char *pic;
};struct card data[100];

void ini(){
	int i;
	for(i=0;i<100;i++){
		img[i]=LoadGraph( "pic/null.png" );data[i].pic="";
	}
}

void loadcarddata(){
	data[0].pic="ChronomalyCrystalChrononaut.png";
	img[0]=LoadGraph(strcat("pic/illu/",data[0].pic));//デバッグ停止地点
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE); // ウィンドウモードに設定
	if( DxLib_Init() == -1 ){return -1 ;}//DXライブラリ初期化処理 エラーが起きたら直ちに終了
	SetDrawScreen( DX_SCREEN_BACK ); //描画先を裏画面に設定

	ini();
	loadcarddata();
	WaitKey() ;				// キー入力待ち

	DxLib_End() ;				// DXライブラリ使用の終了処理
	return 0 ;				// ソフトの終了 
}
デバッグ中には自動変数と言う所に表示された変数の中でdata[0].picとimgが赤く表示されていたのでこれらの変数におかしな値が入っているのだと思われますが、どこで変な値が入ってしまっているのかが分かりません。
一体何故アクセス違反が起こってしまっているのでしょうか?また、どうしたらアクセス違反が起こらないように出来るでしょうか?
どなたかよろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: アクセス違反の原因が分かりません

#2

投稿記事 by みけCAT » 11年前

文字列リテラルを書き換えようとしてはいけません。(未定義の動作かもしれません)
すなわち、16行目が間違っています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: アクセス違反の原因が分かりません

#3

投稿記事 by みけCAT » 11年前

wasawasa さんが書きました:また、どうしたらアクセス違反が起こらないように出来るでしょうか?
一時バッファを用いてcharの配列で表現された文字列を結合するか、std::stringを使うといいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: アクセス違反の原因が分かりません

#4

投稿記事 by softya(ソフト屋) » 11年前

strcat("pic/illu/",data[0].pic)が定数を書き換えようとしてます。
その先を書き換えられるかは環境依存な上に書き変えられても定数領域を破壊してしまうでしょう。ヤバイです。
mallocなどで必要十分なメモリを別に割り当てる必要があります。

あと文の後ろに文を書くのは見逃しやすいので止めたほうが良いと思います。
特に他人は見逃しますので質問には不向きな書き方です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

wasawasa
記事: 94
登録日時: 11年前

Re: アクセス違反の原因が分かりません

#5

投稿記事 by wasawasa » 11年前

>文の後ろに文を書くのは見逃しやすいので止めたほうが良い
すみません、次から気をつけます

ソースの方は15~16行目を下記のように書き変えたら無事デバッグ出来ました。ありがとうございます。

コード:

        char rewrite[]="pic/illu/";//書き換え用
        char numeron[256];
	strcpy(numeron,rewrite);
	strcat(numeron,data[0].pic);
	img[0]=LoadGraph(numeron);//エラー発生地点

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: アクセス違反の原因が分かりません

#6

投稿記事 by softya(ソフト屋) » 11年前

こうしたほうが分かりやすいですよの例を書いておきます。

コード:

		char filepath[256];
		strcpy( filepath, "pic/illu/" );//パスを設定
		strcat( filepath, data[0].pic );//ファイル名
		img[0] = LoadGraph( filepath ); //読み込み
気をつけるのは、変数名の付け方、定数で良い所は定数をそのまま使うって所でしょうか。インデントも合わせましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る