繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM