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

标签 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

最佳答案

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/

相关文章:

c++ - 从另一个 .cpp 文件调用函数

c - 为什么在 64 位架构上对齐是 16 字节?

c - 堆溢出问题 - 可以覆盖 block header ,损坏 Free(),但程序不会崩溃

c++ - 在 Visual C++ 中使用 C Cluster 库

php - 有什么方法可以检查匿名函数吗?

c - 为什么我的数组在作为参数传递时被删除?

c - 为什么 int 变量的值是 `0xffffffff` >> 1 != 0x7fffffff?

c - 如何计算数字序列中的谷数?

ios - Swift,为什么类方法不需要闭包列表

python - 我正在尝试创建一个输入名称并输出排名的函数。创建该功能的最佳方法是什么?