当我在 main 函数中调用它时,C-2d 阵列打印函数不起作用

C-2d array print function not working when I call it in main function

提问人:Vali RO 提问时间:11/1/2021 最后编辑:Vlad from MoscowVali RO 更新时间:11/1/2021 访问量:167

问:

我编写了两个函数,readMatrix,它分配一个双指针并从键盘获取输入,第二个函数是打印函数。

当我在 main 函数中调用 print 函数时,它不能完全工作。

这是代码:

void print(int** mat, int lin, int col) {
    int i,j;
    printf("Matrix is:\n");
    for(i=0; i<lin; i++) {
        for(j=0; j<col; j++) {
            printf("%d ", *(*(mat+i)+j));
        }
        printf("\n");
    }
}

int** readMatrix(int** mat, int lin, int col) {
    int x;
    int i,j;
    mat==(int**)malloc(lin*sizeof(int*));
    for(x=0; x<lin; x++) {
        mat[x]=(int*)malloc(col*sizeof(int));
    }
    
    for(i=0; i<lin; i++) {
        printf("Line %d: ", i);
        for(j=0; j<col; j++) {
            scanf("%d",  &mat[i][j]);
        }
    }
}


int main()
{
    int lin, col;
    int i,j;
    printf("Enter number of lines: ");
    scanf("%d", &lin);
    printf("Enter number of cols: ");
    scanf("%d", &col);
    int** mat = readMatrix(mat,lin,col);
    print(mat,lin,col);
    return 0;
}

输入后,我收到消息“Matrix is”,但矩阵没有出现,为什么?

如果我在 readMatrix 函数中调用 print 函数,它可以工作,但是如果我在 main 中调用它,为什么它不起作用?

谢谢。

c 指针 多维数组 malloc 动态内存分配

评论

0赞 user3629249 11/3/2021
关于:和类似的语句:1)返回的类型(在C中)是可以分配给任何指针的。强制转换只会使代码混乱,并且容易出错。2) 对于可靠的代码,请始终检查 (!=NULL) 返回的值以确保操作成功mat==(int**)malloc(lin*sizeof(int*));void*

答:

1赞 Vlad from Moscow 11/1/2021 #1

函数中未使用参数 mat,因为其值 id 被覆盖readMatrix

int** readMatrix(int** mat, int lin, int col) {
    int x;
    int i,j;
    mat==(int**)malloc(lin*sizeof(int*));
    //...

此外,该函数不返回任何内容,尽管其返回类型不是 void。

所以这个记录

int** mat = readMatrix(mat,lin,col);

调用未定义的行为。

你至少需要声明函数 lie

int** readMatrix( int lin, int col);

并在函数末尾写入

return mat;

例如

int** readMatrix(int lin, int col) {
    int **mat==(int**)malloc(lin*sizeof(int*));
    //...

    return mat;
}

该函数将被调用为

int** mat = readMatrix(lin,col);

同样在 main 中,当不再需要数组时,您应该释放所有分配的内存。

例如

for ( i = 0; i < lin; i++ )
{
    free( mat[i] );
}

free( mat );

评论

0赞 Vali RO 11/1/2021
谢谢,我忘了归还矩阵。因此,我应该从列表参数中删除垫子,并且应该声明int** mat = ....在函数内部,对吧?我想这样做,但我读到如果我返回一个局部变量,如 **mat,当我调用函数时,那个垫子它不应该被销毁吗?像正常变量一样?
0赞 Vali RO 11/1/2021
我按照你说的做了,它正在工作,谢谢!但我仍然想知道返回局部变量。如果我返回一个局部变量(我知道这是不允许的)和返回指针有什么区别?
0赞 Vlad from Moscow 11/1/2021
@ValiRO,您还需要释放 main 中所有分配的内存。
0赞 Vali RO 11/1/2021
是的,谢谢:)
0赞 Vlad from Moscow 11/1/2021
@ValiRO 该函数返回指针值的副本,该指针分配给 main 中的变量 mat。堆中分配的内存仍然有效。
1赞 Eric Postpischil 11/1/2021 #2

readMatrix作为参数,但这毫无用处,因为它只接收它的值,而且还没有值。(为了能够更改调用例程中的变量,例程必须接收指向该变量的指针,而不是其值。mat

readMatrix声明为 return,但没有语句。int **return

mat==(int**)malloc(lin*sizeof(int*));uses ,用于比较值。它不执行分配。==

从 的声明中删除该参数。从对 的调用中删除参数。将 更正为 .添加一个语句,该语句返回 中执行的分配的值。matreadMatrixmatreadMatrix===returnmatreadMatrix

评论

0赞 Vali RO 11/1/2021
谢谢,我忘了归还矩阵。因此,我应该从列表参数中删除垫子,并且应该声明int** mat = ....在函数内部,对吧?我想这样做,但我读到如果我返回一个局部变量,如 **mat,当我调用函数时,那个垫子它不应该被销毁吗?像正常变量一样?
0赞 Vali RO 11/1/2021
我按照你说的做了,它正在工作,谢谢!但我仍然想知道返回局部变量。如果我返回一个局部变量(我知道这是不允许的)和返回指针有什么区别?
0赞 Eric Postpischil 11/1/2021
@ValiRO:可以返回局部变量的值。不应返回局部自动变量的地址。一旦知道变量的值,您就知道了该值,因此可以安全地返回该值。但是,当您知道变量的地址时,它仅在其生存期内具有该地址。当函数返回时,其局部自动变量的生存期结束,并且它们以前的地址将失效。