[英]Can I pass an int to a void function in C?
我正在尝试使用函数让用户输入n
x 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程序中的错误类型令人讨厌,因为堆栈“幸运地”保留了部分值,但“不幸地”,这一事实掩盖了真正的问题:局部变量在函数退出后消失了。
为了详细说明以上答案,当您在函数中声明变量时,即在堆栈上声明它。
您可以全局声明和初始化,但这与您想要执行的操作不同。 在某些方面更容易,因为取决于堆栈内存,但更严格。
要使用当前的实现,请改为通过在堆上分配来初始化矩阵。 使用calloc()分配空间并将其清零。 然后,当您返回时,将指针返回到矩阵。 缺点是需要更多的内存管理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.