为什么 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 = 8
和 n = 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};
我们有一个使用表格(数组)制作扫雷游戏的项目,但是当我尝试打印边框时,如果 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 = 8
和 n = 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};