行列乗算プログラムを作成していて、コードスペースを節約するためmake
に、ダブルポインターへのポインターを受け取り、指定されたサイズの2次元配列を動的に割り当てる関数を作成しました。配列a
とb
は、[-2、2]のランダムな値に初期化されます。ただし、gccでコードを実行しようとすると、セグメンテーション違反が発生します。
b[0][0]
gdbを介してコードを実行しましたが、乱数に設定しようとするとエラーが発生します。b[0][0]
gdbで印刷しようとすると、次のエラーが発生します。
アドレス0xbfebfdc3f5d77f80のメモリにアクセスできません
しかし、実際にはb[0][0]
これより前にアクセスすることができます。割り当てた直後にエラーなしで配列を出力できます。何らかの理由で、b
問題を引き起こしているように見えるのは常にアレイです。
ポインタの問題だと感じていますが、どこにあるのかわかりません。私はそれほど経験の浅いプログラマーではありませんが、このエラーが表示され続ける理由を見つけるために2日間の内臓を費やしました。誰かが光を当てることができますか?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void make(double ***a, int m, int n)
{
int i;
double *tmp;
(*a) = (double **) malloc(m*sizeof(double *));
tmp = (double *) calloc(m*n,sizeof(double));
if(tmp == NULL)
{
printf("Error with malloc.\n");
exit(EXIT_FAILURE);
}
for(i=0;i<m;i++)
(*a)[i] = &tmp[i*n];
free(tmp);
if(a == NULL)
{
fprintf(stderr, "Error with the matrix, dimensions: %d, %d. \n", m, n);
exit(EXIT_FAILURE);
}
}
int main()
{
int i, j;
int l, m, n;
double **a, **b, **c;
l = m = n = 8;
srand48(time(NULL));
make(&a, l, m);
make(&b, m, n);
make(&c, l, n);
for(i=0; i<l; i++)
for(j=0; j<m; j++)
a[i][j] = (drand48()*4.0) - 2.0;
for(i=0; i<m; i++)
for(j=0; j<n; j++)
b[i][j] = (drand48()*4.0) - 2.0;
free(a);
free(b);
free(c);
return 0;
}