在 C 中动态初始化数组时出错



>我正在使用动态初始化来生成两个矩阵。但问题是我的调试器在函数"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 *));
^^^^^^

此外,您还应该释放分配的内存。否则程序中存在内存泄漏。

  1. 在这种情况下,主要问题是 - 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变量分配内存,而这些变量在前面的情况下没有。

  1. 检查mallocscanf的返回值。例如:

    (*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);
}
  1. 在函数Function(我会说命名错误)中,您正在使用全局变量row.这是不好的做法,对代码的可读性和可维护性有问题。调试要困难得多。

相关内容

  • 没有找到相关文章