2016-07-28 3 views
0

파일에서 읽고 값을 참조로 인수로 전달 된 2 차원 배열에 넣어야하는 read_mat() 함수가 있습니다. malloc()을 사용하여 메모리를 올바르게 할당 한 후에는 두 번째 위치에서 마지막 위치로 배열에 값을 넣는 데 어려움이 있습니다. 그 크기는 N x 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()이 코드가 더 나은 것 성공 여부를 확인하기 위해 몇 가지 코드를 추가

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

해야 원하는 것은.

+0

그게 날 채워서 배열을 채우는거야! MikeCAT에게 감사드립니다. –

관련 문제