为什么 printf 不输出大数组?

Why won't printf output a large array?

我们有一个使用表格(数组)制作扫雷游戏的项目,但是当我尝试打印边框时,如果 m & n 变量大到 [=12],它不会让我打印它=] 和 n = 18 或更大,使控制台完全空白。

#include <stdio.h>
#include <stdlib.h>

void main() {
    int m, n, i, j;
    m = 16;
    n = 18;

    int MainTable[m - 1][n - 1];

    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            MainTable[i][j] = 0;
        }
    }

    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            printf("%d ", MainTable[i][j]); 
        }
        printf("\n"); 
    }
}

但是当我将变量降低到 m = 8n = 8 时,它将按预期工作。我认为这与printf能力的某种限制有关。

有人可以帮助我了解问题所在并作为修复方法吗?

您以未定义的行为访问数组外,替换

int MainTable [m-1][n-1];

来自

int MainTable [m][n];

或者在你的循环之前停止一个索引,但这是一种不可读的方式

你在定义数组时给出的每个维度是元素的数量,而不是较高有效索引的值

其中 int main(... 而不是 void main(...

这有点晚了,但这是因为您声明了一个每行 15 行 17 列的数组。

    int MainTable [m-1][n-1];

然后您尝试打印 16 行 18 列的数组

 for(i=0;i<m;i++){
    for(j=0;j<n;j++){
        printf("%d ",MainTable [i][j]); 
    }
    }

因此,要修复您的代码,您需要更改每行 16 行 18 列的数组

    int MainTable [m][n];

或者简单地打印在正确的范围内

for(i=0;i<m-1;i++){
    for(j=0;j<n-1;j++){
        printf("%d ",MainTable [i][j]); 
    }
    }

现在转到这部分(我回答的主要原因),使用两个变量来限制数组的大小可能会导致很多问题,例如失去初始化数组(或为其设置值)的能力) 从头开始​​

为此,我们应该使用像这样的常量值

#include <stdio.h>
#include <stdlib.h>
#define m 16
#define n 18
void main() {
int i,j;

int MainTable [m-1][n-1];

您通过#define 赢得了记忆。它会简单地用给定的值替换代码中存在的每个 m 和 n。这也将导致我们用这个

而不是初始化您的代码
 for(i=0;i<m;i++){
    for(j=0;j<n;j++){
        MainTable [i][j] = 0;
    }
}

你可以跳到这里

int MainTable [m-1][n-1] = {0};