mallocについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ageha1012

mallocについて

#1

投稿記事 by ageha1012 » 11年前

mallocをユーザ関数で作りました、
値をいれてprintfなどで確認するとユーザ関数の中では無事動的確保できているようです
しかしmain関数で中身を見ようとするとセグメンテーションフォルトがでます、どうやらmain関数に返せてないようです
返し値の部分がいけないような気がするのですがアドバイスお願いします

以下ソースコードです。
動的確保する変数は**matrixでmain関数で宣言しています

main関数にxmaxというx軸の最大値が欲しいので

コード:

xmax=newspace(xpoint,ypoint,xmax,matrix);
こう書いています、こちらにも問題があるかもしれません


以下のユーザ関数がx軸とy軸の最大値を求めて(xmax,ymax)その幅でmatrixの二次元配列を動的確保するプログラムです
またfreeで解放するときにこのmatrixのx幅の数が知りたいためxmaxをmain関数に返します

コード:

int newspace(double xpoint[4],double ypoint[4],int xmax,int **matrix){
		int ymax,i,j;
		relax(xpoint);
		relax(ypoint);
		xmax=maxpoint(xpoint);
		ymax=maxpoint(ypoint);

		//TEST
		printf("\n\n%d  %d\n",xmax,ymax);
		
		matrix=(int **)malloc(sizeof(int *)*xmax);
		for(i=0;i<xmax;i++){
			matrix[i]=(int *)malloc(sizeof(int)*ymax);
		}
	return xmax,matrix;
	}

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

Re: mallocについて

#2

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

このコードだと、newspaceの戻り値としてmatrixが返ります。
「キャストせずにポインタから整数を作っています」みたいな警告が出ませんでしたか?
おそらくmatrixに入っている値は(メモリ確保に成功していれば)整数としてみるとかなり大きな値だと思います。
この関数において、xmaxは値の最大値ではなく要素数として機能しているようなので、
返り値を要素数を表すxmaxとして利用した結果、確保した領域の外にアクセスしている可能性が高いです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: mallocについて

#3

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

仮引数のxmaxとmatrixの値を一度も関数内で使用せずに代入しているので、仮引数にする意味がないと思います。
relax関数の役割がわからないですが、
newspace関数およびそこで呼び出している関数でxpointおよびypointの中身を書き換えない場合、
個人的にはconst指定をつけたほうがいいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: mallocについて

#4

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

コードの一部のみ載せている、もしくは関数を書きかけということも考えられますが、
提示されたコードの中では変数jは使用されていませんね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ageha1012

Re: mallocについて

#5

投稿記事 by ageha1012 » 11年前

すみませんすべてのソースを乗せるととてつもない行になるので必要な部分だけ載せました
relaxは計算の結果を正の整数になおすためのユーザ関数です
jは確保できているか確認するときに2重のforループの時に使用したものです、消し忘れました

main関数で**matrixを宣言していて
newspace関数でそれを確保しているからmatrixは返さなくて大丈夫ということですか?

コード:

return xmax;
}
ということですかね?

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

Re: mallocについて

#6

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

ageha1012 さんが書きました:main関数で**matrixを宣言していて
newspace関数でそれを確保しているからmatrixは返さなくて大丈夫ということですか?
違います。
ageha1012 さんが書きました:

コード:

return xmax;
}
ということですかね?
要素数の問題は解決されますが、(newspace関数の中で開放していない場合)ポインタmatrixのデータが消えてメモリリークが起こります。
仮引数のmatrixの型をint***にして、呼び出すときにポインタを渡すことによりデータを受け取るといいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: mallocについて

#7

投稿記事 by usao » 11年前

これってxmaxだけでなくymaxの情報も返さないと
使う側が困るんじゃないかと思うのですがどうなんでしょう?

コード:

//xmax, ymax, matrix を構造体にまとめて返すとか
typedef
struct SMatrix{
  int xmax;
  int ymax;
  int** matrix;
} SMatrix;

SMatrix newspace( double xpoint[4], double ypoint[4] )  //※引数の書き方がちょっとひっかかるけどとりあえずそのまま
{
  SMatrix M;
  relax( xpoint );
  relax( ypoint );
  M.xmax = maxpoint( xpoint );
  M.ymax = maxpoint( ypoint );
  M.matrix = AllocMatrix( xmax, ymax );
  return M;
}

//所望のサイズのマトリクスをつくる
//※xとyの使われ方(順番)が気になるけど とりあえずそのまま
int** AllocMatrix( size_t x_size, size_t y_size )
{
  int **M = NULL;
  M = (int**)malloc( sizeof(int*) * x_size );
  for( i=0; i<x_size; i++ )
  {
    M[i] = (int*)malloc( sizeof(int) * y_size );
  }
  return  M;
}

閉鎖

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