2016-06-30 5 views
0

나는이 작업을 수행하기 위해 내가 알고있는 모든 조합을 시도한 것처럼 느껴져서 알아낼 수 없습니다. 함수에 대한 포인터로 int**을 전달하려면 어떻게해야합니까? 검색을 시도했지만 찾을 수 없습니다. 복제본 인 경우 알려 주시면 삭제하겠습니다. 그것은 달리는 것을 시작하고 약간 가치를 들어가기 후에 segfaults.이중 포인터에 대한 포인터로 scanf() 사용

여기 내 코드입니다, 나는 그것이 setMatrix() 함수의 scanf() 라인에 엉망으로 생각 :

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

// create zero initialized matrix 
int** callocMatrix(int rmax, int colmax) { 
     int **mat = calloc(rmax, sizeof(int*)); 
     for(int i = 0; i < rmax; i++) mat[i] = calloc(colmax, sizeof(int)); 
     return mat; 
} 

// fill matrix 
void setMatrix(int ***mat, int r, int c){ 
    printf("Insert the elements of your matrix:\n"); 
    for (int i = 0; i < r; i++) { 
     for (int j = 0; j < c; j++) { 
      printf("Insert element [%d][%d]: ", i, j); 
      scanf("%d", mat[i][j]); // problem here?? 
      printf("matrix[%d][%d]: %d\n", i, j, (*mat)[i][j]); 
     } 
    } 
    return; 
} 

// print matrix 
void printMatrix(int ***mat, int r, int c){ 

    for (int i=0; i<r;i++){ 
     for (int j=0; j<c;j++) { 
       printf("%d ", (*mat)[i][j]); 
     } 
     printf("\n"); 
    } 

} 

int main(int argc, char *argv[]) { 

    int r = 3, c = 3; 

    int **mat = callocMatrix(r, c); 

    setMatrix(&mat, r, c); 

    printMatrix(&mat, r, c); 
} 
+0

제목에 '이중 포인터'는 오해의 소지가 있습니다. 당신은'int ** '를 참조하고 있지만'double *'을 말하는 것처럼 들린다. –

답변

3

트리플 포인터 ***를 사용할 필요가 없습니다. 2 차원 배열을 전달하면 그대로 작동합니다. 여기 코드는 다음과 같습니다

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

// create zero initialized matrix 
int** callocMatrix(int rmax, int colmax) { 
    int **mat = calloc(rmax, sizeof(int*)); 
    for(int i = 0; i < rmax; i++) mat[i] = calloc(colmax, sizeof(int)); 
    return mat; 
} 

// fill matrix 
void setMatrix(int **mat, int r, int c){ 
    printf("Insert the elements of your matrix:\n"); 
    for (int i = 0; i < r; i++) { 
     for (int j = 0; j < c; j++) { 
      printf("Insert element [%d][%d]: ", i, j); 
      scanf("%d", &mat[i][j]); // no problem here 
      printf("matrix[%d][%d]: %d\n", i, j, mat[i][j]); 
     } 
    } 
} 

// print matrix 
void printMatrix(int **mat, int r, int c){ 

    for (int i=0; i<r;i++){ 
     for (int j=0; j<c;j++) { 
       printf("%d ", mat[i][j]); 
     } 
     printf("\n"); 
    } 
} 

int main(int argc, char *argv[]) { 

    int r = 3, c = 3; 

    int **mat = callocMatrix(r, c); 

    setMatrix(mat, r, c); 

    printMatrix(mat, r, c); 
} 
+0

누군가가 포인터를 이중 포인터에 대한 포인터로 전달해야하는 다른 함수에서 포인터를 편집하고 싶다고 말하면 이것이 잘못된 것인가? 아니면 내가 오해 한 것입니까? – Austin

+1

또한'scanf ("% d", & (* mat) [i] [j])를 시도해 보았습니다. – Austin

+1

포인터를 편집하려면 올바른 방법입니다. 이 경우 포인터를 편집하지 않고 포인터가 가리키는 값을 변경합니다. 그러므로'setMatrix'가'callocMatrix'처럼 메모리의 행렬 위치를 변경하지 않으면, 행렬을 포인터로 전달할 필요가 없습니다. – ilya1725

2

을해야합니다 당신이 (*으로) 그것을 역 참조 할 필요가 그래서 당신은 당신이 printf와 마찬가지로, 행렬 객체 당신에 대한 포인터를 전달하는

scanf("%d", &(*mat)[i][j]); 

. scanf 그러면 쓰기 할 요소의 주소가 필요하므로 &

관련 문제