2016-06-30 1 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は、書き込む要素のアドレスが必要であるため、&

関連する問題