提问人:Vali RO 提问时间:11/1/2021 最后编辑:Vlad from MoscowVali RO 更新时间:11/1/2021 访问量:167
当我在 main 函数中调用它时,C-2d 阵列打印函数不起作用
C-2d array print function not working when I call it in main function
问:
我编写了两个函数,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 中调用它,为什么它不起作用?
谢谢。
答:
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 ,用于比较值。它不执行分配。==
从 的声明中删除该参数。从对 的调用中删除参数。将 更正为 .添加一个语句,该语句返回 中执行的分配的值。mat
readMatrix
mat
readMatrix
==
=
return
mat
readMatrix
评论
0赞
Vali RO
11/1/2021
谢谢,我忘了归还矩阵。因此,我应该从列表参数中删除垫子,并且应该声明int** mat = ....在函数内部,对吧?我想这样做,但我读到如果我返回一个局部变量,如 **mat,当我调用函数时,那个垫子它不应该被销毁吗?像正常变量一样?
0赞
Vali RO
11/1/2021
我按照你说的做了,它正在工作,谢谢!但我仍然想知道返回局部变量。如果我返回一个局部变量(我知道这是不允许的)和返回指针有什么区别?
0赞
Eric Postpischil
11/1/2021
@ValiRO:可以返回局部变量的值。不应返回局部自动变量的地址。一旦知道变量的值,您就知道了该值,因此可以安全地返回该值。但是,当您知道变量的地址时,它仅在其生存期内具有该地址。当函数返回时,其局部自动变量的生存期结束,并且它们以前的地址将失效。
评论
mat==(int**)malloc(lin*sizeof(int*));
void*