我正在尝试使用函数让用户输入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
答案 0 :(得分:2)
void ucitajmatricu(int n){
...
int MAT [n] [n];
...
void ispisimatricu(int n){
int i,j,MAT [n] [n];
MAT [] []的两个声明具有不同的功能-它们不保留其值,并且它们具有相同的名称并不重要。
在函数外声明一次MAT [] []。而且,顺便说一句,这个问题似乎与问题的标题无关。
评论后编辑
该程序似乎仅能部分工作,因为在第一次调用中,值被读取并存储在本地数组(在堆栈中)中。第二个被调用函数具有相似(如果不相同)的堆栈框架,因此在第二个调用中声明和实例化的框架几乎覆盖了前一个框架,即100%。第二个函数似乎保留了大部分值,但这只是运气(或运气...)。如果在这两次调用之间还有其他对其他函数的调用,则堆栈将更容易损坏(很好,被覆盖),并且部分工作的效果将降低。
OP程序中的错误类型令人讨厌,因为堆栈“幸运地”保留了部分值,但是“不幸地”这一事实掩盖了真正的问题:局部变量在函数退出后消失了。
答案 1 :(得分:0)
要详细说明上述答案,请在函数中声明变量时,是在堆栈上声明它。
您可以全局声明和初始化,但这与您想要执行的操作不同。在某些方面更容易,因为取决于堆栈内存,但更严格。
要使用当前的实现,请改为通过在堆上分配来初始化矩阵。使用calloc()分配空间并将其清零。然后,当您返回时,将指针返回到矩阵。缺点是需要更多的内存管理。