使用带有指向双指针的指针的scanf()

时间:2016-06-30 23:36:23

标签: c multidimensional-array scanf pass-by-pointer

我觉得我已经尝试过我所知道的每一种组合,以使其发挥作用并且无法弄明白。我如何将int**作为指向函数的指针传递给scanf()?我试过搜索但是找不到这个,如果它重复,请告诉我,我会删除。它开始运行,在输入一些值之后就会出现段错误。

这是我的代码,我认为它弄乱了setMatrix()函数的#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); } 行:

{{1}}

2 个答案:

答案 0 :(得分:3)

无需使用三指针***。传递二维数组将按原样工作。这是代码:

#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);
}

答案 1 :(得分:2)

应该是:

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

您正在向矩阵对象传递指针,因此您需要将其取消引用(使用*),就像使用printf一样。 scanf然后需要写入元素的地址,因此您需要&