for文におけるsegmentation faultについて質問です。

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

for文におけるsegmentation faultについて質問です。

#1

投稿記事 by konoha » 7年前

下記プログラミングを実行するとsegmantation faultが起きます・・・
どうやら(1)と(2)がfor文中に同時に存在すると起きるのですが、一体何故でしょうか?

#include <stdio.h>
#include <stdlib.h>

double **dmatrix(int, int); /* 行列領域の確保 */

int main(void) {
char buf[40];
int nrow, ncol; /* 行数, 列数 */
int i, j;
double **matrix1; /* ポインタへのポインタ */

setbuf(stdout,NULL);

printf("# of rows: ");
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%d", &nrow);
printf("# of columns: ");
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%d", &ncol);

printf("matrix1 allocation\n");
matrix1 = dmatrix(nrow, ncol); /* 領域確保 */
for (i=0; i < nrow; i++){ /* (i,j)要素にi+jを代入 */
for (j=0; j < ncol; j++){
matrix1[j] = (double)(i+j);//////////////////////////////////////(1)
printf("%f\n",(double)(i+j));///////////////////////////////////////(2)
}
}
for (i=0; i < nrow; i++){ /* 全成分の表示 */
for (j=0; j < ncol; j++){
printf("matrix1[%d][%d] = %f\n",i,j,matrix1[j]);
printf("%f\n",(double)(i+j));
}
}
free(matrix1);
return 0;
}

double **dmatrix(int nr, int nc) {
double **mat;
mat = malloc(nr*sizeof(double *));
if (mat == NULL)
puts("Failure!! (from (*dmatrix)[nr])");
else {
int i, j;
double *base = malloc(nr*nc*sizeof(double));
if (base == NULL)
puts("Failure!! (from dmatrix[nr][nc])");
else {
for (i=0; i < nr; i++)
mat = base + i*nc;
}
free(base);
}
return(mat);
}

konoha
記事: 5
登録日時: 7年前

Re: for文におけるsegmentation faultについて質問です。

#2

投稿記事 by konoha » 7年前

nr,ncに3を代入した場合におかしくなりました・・・

konoha
記事: 5
登録日時: 7年前

Re: for文におけるsegmentation faultについて質問です。

#3

投稿記事 by konoha » 7年前

すみません
プログラムコードに色付けをしました

コード:

#include <stdio.h>
#include <stdlib.h>

double **dmatrix(int, int); /* 行列領域の確保 */

int main(void) {
char buf[40];
int nrow, ncol; /* 行数, 列数 */
int i, j;
double **matrix1; /* ポインタへのポインタ */

setbuf(stdout,NULL);

printf("# of rows: ");
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%d", &nrow);
printf("# of columns: ");
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%d", &ncol);

printf("matrix1 allocation\n");
matrix1 = dmatrix(nrow, ncol); /* 領域確保 */
for (i=0; i < nrow; i++){ /* (i,j)要素にi+jを代入 */
for (j=0; j < ncol; j++){
matrix1[i][j] = (double)(i+j);//////////////////////////////////////(1)
printf("%f\n",(double)(i+j));///////////////////////////////////////(2)
}
}
for (i=0; i < nrow; i++){ /* 全成分の表示 */
for (j=0; j < ncol; j++){
printf("matrix1[%d][%d] = %f\n",i,j,matrix1[i][j]);
printf("%f\n",(double)(i+j));
}
}
free(matrix1);
return 0;
}

double **dmatrix(int nr, int nc) {
double **mat;
mat = malloc(nr*sizeof(double *));
if (mat == NULL) 
puts("Failure!! (from (*dmatrix)[nr])");
else {
int i, j;
double *base = malloc(nr*nc*sizeof(double));
if (base == NULL)
puts("Failure!! (from dmatrix[nr][nc])");
else {
for (i=0; i < nr; i++)
mat[i] = base + i*nc;
}
free(base);
}
return(mat);
}

konoha
記事: 5
登録日時: 7年前

Re: for文におけるsegmentation faultについて質問です。

#4

投稿記事 by konoha » 7年前

i+jの型変換の際にメモリをとる領域がおかしくなるのかと思って
(double)の型変換を取り除きましたがおかしいままでした・・・

konoha
記事: 5
登録日時: 7年前

Re: for文におけるsegmentation faultについて質問です。

#5

投稿記事 by konoha » 7年前

どうやらnr,ncに代入する値をある程度大きくしたらなんとか動作するようです。
しかし、1や2、3などの小さな値ではエラーを起こすのが不思議です・・・

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

Re: for文におけるsegmentation faultについて質問です。

#6

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

konoha さんが書きました:下記プログラミングを実行するとsegmantation faultが起きます・・・
どうやら(1)と(2)がfor文中に同時に存在すると起きるのですが、一体何故でしょうか?
オフトピック
ここでの「プログラミング」は、「プログラム」の間違いではないでしょうか?
dmatrix関数内においてmatの要素にbaseが指す領域へのポインタを代入していますが、
その後baseをfreeしてしまってからmatを返しているので、main関数の(1)で解放済みの領域に値を書き込み、未定義動作になります。
konoha さんが書きました:i+jの型変換の際にメモリをとる領域がおかしくなるのかと思って
(double)の型変換を取り除きましたがおかしいままでした・・・
具体的にどのようなコードにしたのか分かりませんが、printfの書式%fはdouble型のデータを要求するので、int型のデータを渡すと未定義動作になります。
オフトピック
この間違ったdmatrix関数、インデントの幅や変数jの有無の違いはありますが、
行列とベクトルの積の計算 • C言語交流フォーラム ~ mixC++ ~
のものとそっくりで、同じ間違いをしていますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

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