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