【问题标题】:Why do I get "cannot allocate an array of constant size 0"? [duplicate]为什么我会得到“无法分配常量大小为 0 的数组”? [复制]
【发布时间】:2012-03-27 00:28:42
【问题描述】:

我正在为学校做一个扫雷程序,但我的代码中不断出现此错误

无法分配常量大小为 0 的数组

我不知道为什么会这样;我没有分配大小 - 我将其设置为 0。另一个问题是,我如何通过 char 读取我的输入 char,以便将其保存在我的数组中?

如下所示,我使用的是输入和输出。我评论了我的输入和输出,所以你们可以看到我在这个程序中使用了什么。我想通过char 读取字符,以便将所有地图保存在数组中。

我正在使用 MSVC++2010。

freopen("input.txt","rt",stdin);
//4 4
//*...
//....
//.*..
//....
//3 5
//**...
//.....
//.*...
//0 0


freopen("output.txt","wt",stdout);

/*Field #1:
*100
2210
1*10
1110

Field #2:
**100
33200
1*100*/
int n=-1;
int m=-1;
int cont =0;
while(n!=0 && m!=0)
{
    scanf("%d %d",&n,&m);
    int VMatriz[n][m]={0};
    int Mapa[n][m]={0};


    if (n==0 && m==0)
        break;
    cont++;
    printf("Field #%d",cont);


    for (int i=0;i<n;i++)
    {   printf("/n");
        for (int j=0;j<m;j++)
        {

            scanf("%d ",&Mapa[i][j]);

            if (Mapa[i][j]=='*')
                {
                    if (j-1>=0)
                        VMatriz[i][j-1]++;
                    if (j+1<m)
                        VMatriz[i][j+1]++;
                    if (i-1>=0)
                        VMatriz[i-1][j]++;
                    if (i+1<m)
                        VMatriz[i+1][j]++;

                    if (j-1>=0 && i-1>0)
                        VMatriz[i-1][j-1]++;
                    if (j-1>=0 && i+1<m)
                        VMatriz[i+1][j-1]++;
                    if (j+1<m && i-1>0)
                        VMatriz[i-1][j+1]++;
                    if (j+1<m && i+1<m)
                        VMatriz[i+1][j+1]++;

                    VMatriz[i][j]='*';

                printf("%d",VMatriz[i][j]);


                }

        }   

    }
    printf("/n");


}
return 0;

}

【问题讨论】:

  • 重新标记为 C,因为代码似乎是这样。
  • @MikeKwan:伙计们,不要重新标记为 C,因为他使用的是 C++ 编译器(Visual Studio 没有显式编译为 C 代码),问题不是零大小的数组,这只是您看到的第二条错误消息。
  • Ed 是正确的,当您尝试在 Visual Studio 中编译这样的代码时,您将首先看到常量表达式错误,然后是零大小错误。
  • 不知道为什么有人会投票结束这个问题,这是一个完全有效的问题(初学者可以理解的问题)。
  • @Giuseppe:请随时通过选择答案并发布有关您当前问题的新线程来解决此线程(假设您找不到涵盖该问题的现有线程)

标签: c++ visual-c++


【解决方案1】:
int VMatriz[n][m]={0};

这是非法的。就像这个更简单的版本一样;

int n = 10;
int x[n]; // C2057

不过……

int x[10]; // ok!

您在这里真正关心的错误是这个错误,而不是“无法分配常量大小为 0 的数组”错误。

错误 C2057:预期的常量表达式

您不能在 C++ 中分配具有自动存储持续时间的未知大小的数组。如果您想要一个可变大小的数组,那么您需要动态分配它(或者,更好的是;只需使用vector)。

请注意,有一个 gcc 扩展允许这样做,但在 VS 中不允许(而且它不是标准 C++。它是为 C++ 11 提交的,但最终被拒绝。)

【讨论】:

  • 哦,现在我明白了,我会尝试动态创建它。看看会发生什么,因为我也想看看输入问题。感谢您的宝贵时间
  • 这在 C 的较新版本中是合法的。
  • @muntoo: 是的,但是他使用的是不支持 C99 的 VS,即使这个 看起来 对我们来说像 C 代码,我几乎可以向你保证他是编译为 C++。所以无论哪种方式,这都是不合法的。
  • 请注意,您可以使用 alloca 解决此限制
猜你喜欢
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
相关资源
最近更新 更多