我正在尝试使用函数让用户输入一个 n
× n
方阵并将其打印出来。
输入矩阵的函数是:ucitajmatricu
并打印出来:ispisimatricu
#include < stdio.h >
#include < stdlib.h >
void ucitajmatricu(int);
void ispisimatricu(int);
int main() {
int n;
scanf("%d", & n);
ucitajmatricu(n);
ispisimatricu(n);
return 0;
}
void ucitajmatricu(int n) {
int i, j;
int MAT[n][n];
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
scanf("%d", & MAT[i][j]);
}
}
printf("\n");
return;
}
void ispisimatricu(int n) {
int i, j, MAT[n][n];
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("%d\t", MAT[i][j]);
}
printf("\n");
}
return;
}
输入示例:
3
1 2 3
4 5 6
7 8 9
示例输出:
1 2 3
4 5 6
7 8 9
实际输出:
1 2 3
4 5 6
7 48 0
最佳答案
void ucitajmatricu(int n) {
...
int MAT[n][n];
...
void ispisimatricu(int n) {
int i, j, MAT[n][n];
MAT[][] 的两个声明位于不同的函数中 - 它们不保留其值,并且它们具有相同的名称这一事实并不重要。
在函数外部声明一次 MAT[][]。而且,顺便说一句,这个问题似乎与问题的标题无关。
评论后编辑
该程序似乎仅部分工作,因为在第一次调用中,值被读取并存储在本地数组(在堆栈中)中。第二个被调用的函数具有类似(如果不相同)的堆栈帧,因此在第二次调用中声明和实例化的帧几乎 100% 地覆盖到前一个函数。第二个函数似乎保留了大部分值,但这只是运气(或不幸......)。如果在两次调用之间存在对其他函数的其他调用,则堆栈将变得更加损坏(好吧,被覆盖),并且仅部分工作的效果将会降低。
OP 程序中的错误类型很严重,因为堆栈“幸运地”保留了部分值,但“不幸地”这个事实掩盖了真正的问题:局部变量在函数退出后消失。
关于我可以将 int 传递给 C 中的 void 函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53916149/