2016-07-28 8 views
0

ファイルから読み込んで値を2-d配列に格納する関数read_mat()があります。この配列は引数として参照渡しされます。 malloc()を使ってメモリを正しく割り当てた後、2番目から最後の位置に配列に値を入れるのに問題があります。そのサイズはN×Mであり、Nは行であり、Mは列である。Cでmallocされた2次元配列へのアクセス

[0] [3]にアクセスしようとした後にseg-faultが発生します。これは最初の行の最後の列である必要がありますが、明らかにメモリには存在しません。 stdio.h、stdlib.hと私の "header.h"ファイルを使用しています。

編集:N = 3、M = 4

int read_mat(int *n, int *m, double ***a) { 

//open file 
FILE *fp = fopen("matrix.dat", "r");  
if (fp == NULL) { 
    fprintf(stderr, "File open failed!\n"); 
    return -1; 
} 

//scan first line for size 
fscanf(fp, "%d %d", n, m); 

//TESTING 
printf("Size of n(rows): %d\n", *n); 
printf("Size of m(columns); %d\n", *m); 

//malloc 1-d array of n # pointers 
*a = malloc(*n * sizeof(double*)); 

//malloc space for m # of columns per row 
for (int i = 0; i < *n; i++) { 
    (*a)[i] = malloc(*m * sizeof(double)); 
} 

//TESTING 
fprintf(stderr, "passed malloc!\n"); 

//scan values and fill array 
//rows loop 
for (int i = 0; i < *n; i++) { 
    printf("value of i: %d\n", i); 
    //column loop 
    for (int j = 0; j < *m; j++) { 
     printf("value of j: %d\n", j); 
     fscanf(fp, "%lf", a[i][j]); 
     printf("accessed a[%d][%d]!\n", i, j); 
    } 
} 
+0

"a [0] [3]"にアクセスすると、 'n'と' m'の値はどうなりますか? – MikeCAT

+0

'malloc'と' fscanf'の返却をチェックしてみませんか? 'malloc'への呼び出しが成功したことをどう知っていますか? – ameyCU

+0

これはmallocの問題ではありませんでしたが、どのように配列の位置を呼び出すかで、fscanfが割り当てられた要素数の戻り値を持っているかどうかわかりませんでした。私はそれを将来使用する必要があります。 –

答えて

0

fscanf(fp, "%lf", a[i][j]); 

が間違っています。これはai要素にアクセスし、i>0の場合無効になる可能性があります。 何が欲しいのは

fscanf(fp, "%lf", &(*a)[i][j]); 

fscanf()はあなたのコードが良くなります成功するかどうかを確認するためにいくつかのコードを追加する必要があります。

+0

それは、アレイを埋めるために私にその部分を渡してしまった! MikeCATに感謝します。 –