【问题标题】:"too many braces around scalar initializer" error when using 2d array in C在 C 中使用二维数组时出现“标量初始化器周围的大括号太多”错误
【发布时间】:2019-03-05 01:42:57
【问题描述】:

我仍在学习 C,但是当我尝试使用 2d 数组时出现错误:

/Users/harry/Dropbox/C/Practise/test_1/main.c:157:9: error: expected expression
int[,] numberGrid = {  
   ^   
/Users/harry/Dropbox/C/Practise/test_1/main.c:158:9: warning: too many braces  
around scalar initializer [-Wmany-braces-around-scalar-init]  
    {1, 2, 3 },

我的代码是:

int main() {
    int[,] numberGrid = {
        {1, 2, 3 },
        {4, 5, 6 },
        {7, 8, 9 }
    };

    printf("%d\n", numberGrid[1, 1]);
}

【问题讨论】:

  • 符号 int[,] 无效 C。您可能的意思是 int numberGrid[3][3] = …
  • ...您也可以only在C iirc中省略数组初始化中的最后一个维度大小
  • @JonathanLeffler 当我将其更改为完全错误时,输出为:-321090932
  • @HarryStanley 是的,因为正如我们所说,这不是用于声明和访问多维度数组的 C 语法。你需要numberGrid[1][1]
  • 嗯,你一定是修改了代码才能编译,这就是进步。但是,您仍然应该从编译器中收到警告——您正在使用 GCC(或者可能是 Clang),因此您应该使用 gcc -std=c11 -Wall -Werror … 作为初学者(对于我自己的工作,我将 -Wextra -Wmissing-prototypes -Wstrict-prototypes 添加到那些)。您似乎受到了 C 以外的语言的影响——例如 Fortran、Pascal、Algol、Ada 或……您不能在下标中有效地使用逗号。您需要printf("%d\n", gridNumber[1][1]); 才能打印出5。你得到的是数组第 1 行的地址。

标签: c multidimensional-array


【解决方案1】:

如 cmets 中所述,符号 int[,] numberGrid = { … 根本不是 C。

如果你写了:

int numberGrid[3][3] = {
    {1, 2, 3 },
    {4, 5, 6 },
    {7, 8, 9 }
};

或:

int numberGrid[][3] = {
    {1, 2, 3 },
    {4, 5, 6 },
    {7, 8, 9 }
};

您将能够编译数组初始值设定项。

然后你需要修复printf() 来打印一个数组元素。逗号在 C 中的下标中没有用(对于大多数实际目的,它“从不”出现在下标中——如果你足够努力,你可以发明异常,但你不应该正常编写这样的代码)。

你可以写:

printf("%d\n", numberGrid[1][1]);

打印5。正如所写的 (printf("%d\n", numberGrid[1,1]);),您正在将地址打印为有符号十进制整数,这不能保证正常工作(64 位机器上的数据截断等)。

【讨论】:

  • 非常感谢,这有助于我了解我哪里出错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多