>我正在使用动态初始化来生成两个矩阵。但问题是我的调试器在函数"printArray"中给了我错误。谁能帮我为什么会这样。我昨天刚刚学习了动态初始化。
在 main 函数中,我从用户那里获取有关矩阵维度的输入,您可以观察到,在这些输入的基础上,我能够动态指定矩阵的维度。
#include <stdio.h>
#include <stdlib.h>
int Function(int [], int , int);
void printArray(int **Matrix, int row, int column);
int row = 0, col = 0;
int **P = 0;
int main() {
printf("Give me Dimensions of Matrix 1 : : ");
printf("No .of Rows : ");
scanf_s("%d", &row);
printf("No .of Columns : ");
scanf_s("%d", &col);
Function(P, row, col);
printArray(P, row, col);
printf("Give me size of Matrix 2 : ");
printf("No .of Rows : ");
scanf_s("%d", &row);
printf("No .of Columns : ");
scanf_s("%d", &col);
Function(P, row, col);
printArray(P, row, col);
system("pause");
return 0;
}
int Function(int **A, int s, int c) {
A = malloc(row * sizeof(int *));
for (int i = 0; i < row; i++) A[i] = malloc(col * sizeof(int *));
for (int i = 0; i < s; i++) {
for (int j = 0; j < c; j++) {
A[i][j] = rand() % 10;
}
}
}
void printArray(int **Matrix, int row, int column) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < column; j++) {
printf("%d ", Matrix[i][j]);
}
puts("");
}
puts("");
}
函数的参数是它的局部变量。您可以想象您的函数定义及其调用方式如下
int **P = 0;
Function(P, row, col);
//...
int Function( /*int **A, int s, int c*/) {
int **A = P;
int s = row;
int c = col;
A = malloc(row * sizeof(int *));
//...
}
因此,可以看出,函数中更改的是函数参数A
。函数中的原始参数P
不会更改。这是处理原始参数副本的函数。
您应该通过引用传递参数,例如
int **P = 0;
Function( &P, row, col);
//...
int Function( int ***A, int s, int c) {
*A = malloc(row * sizeof(int *));
//...
}
或从函数返回创建的指针。例如
int **P = 0;
P = Function( row, col);
//...
int ** Function( int s, int c) {
int **A = malloc(row * sizeof(int *));
//...
return A;
}
考虑到该函数具有返回类型int
,但不返回任何内容。
此外,函数使用函数内的 gobal 变量行代替参数也是一个错误,例如
for (int i = 0; i < row; i++) A[i] = malloc(col * sizeof(int *));
^^^^^^
此外,您还应该释放分配的内存。否则程序中存在内存泄漏。
- 在这种情况下,主要问题是 - C 是按值传递的,当您将其传递给函数时,您没有对全局变量进行任何更改 - 而是更改了局部变量 - 被调用函数的局部
Function
。要对其进行更改,您需要传递其地址。然后通过取消引用它,您可以对实际变量进行更改。
此外,除非您有有效的内容要从函数返回,否则使其返回类型为void
。
例如:(说明目的)
Function(&P, row, col);
...
void Function(int ***A, int s, int c) {
(*A) = malloc(s * sizeof(int *));
for (int i = 0; i < s; i++) (*A)[i] = malloc(c * sizeof(int));
for (int i = 0; i < s; i++) {
for (int j = 0; j < c; j++) {
(*A)[i][j] = rand() % 10;
}
}
}
还要注意
A[i] = malloc(col * sizeof(int *));
将是
(*A)[i] = malloc(col * sizeof(int ));
^^^^^
您需要为那些int
变量分配内存,而这些变量在前面的情况下没有。
检查
malloc
和scanf
的返回值。例如:(*A) = malloc(row * sizeof(int *)); if( (*A) == NULL){ perror("Malloc failed"); exit(EXIT_FAILURE); }
和-
if( scanf_s("%d", &row)!= 1){
fprintf(stderrm,"Error in input");
exit(EXIT_FAILURE);
}
- 在函数
Function
(我会说命名错误)中,您正在使用全局变量row
.这是不好的做法,对代码的可读性和可维护性有问题。调试要困难得多。