C中动态初始化数组时出错[复制]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C中动态初始化数组时出错[复制]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
我正在使用动态初始化来生成两个矩阵。但问题是我的调试器在函数“printArray”中给出了错误。任何人都可以帮助我为什么会这样。我刚刚学会了动态初始化。
在主函数中,我从用户那里获取关于矩阵维数的输入,你可以观察到在这些输入的基础上我能够动态指定矩阵的维数。
#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
但没有返回任何内容。
另外,例如,函数使用函数中的全局变量行而不是参数,这是一个错误
for (int i = 0; i < row; i++) A[i] = malloc(col * sizeof(int *));
^^^^^^
你也应该释放分配的内存。否则程序中存在内存泄漏。
另一答案
- 在这种情况下,主要问题是 - C是按值传递,当您将其传递给函数时,您没有对全局变量进行任何更改 - 而是将局部变量 - local更改为调用函数
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
。这是一种不好的做法,对代码可读性和可维护性也存在问题。调试更加困难。
以上是关于C中动态初始化数组时出错[复制]的主要内容,如果未能解决你的问题,请参考以下文章