我可以将int传递给C中的void函数吗?

时间:2018-12-24 17:17:14

标签: c function

我正在尝试使用函数让用户输入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

2 个答案:

答案 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()分配空间并将其清零。然后,当您返回时,将指针返回到矩阵。缺点是需要更多的内存管理。