【问题标题】:Why does my array initialisation not compile? [duplicate]为什么我的数组初始化无法编译? [复制]
【发布时间】:2013-05-03 15:07:42
【问题描述】:

当我在 MSVS 中运行以下代码时,编译器会给出

“错误1错误C2059:语法错误:'{'

我确定我正确地声明和初始化了二维数组。 语法错误在哪里?

#include <stdio.h>
#define STUDENTS 3
#define EXAM 4
void printArray(int array[][EXAM]);

int main(void){

int array[STUDENTS][EXAM];
array={ { 77, 68, 86, 73 },{ 96, 87, 89, 78 },{ 70, 90, 86, 81 } };

【问题讨论】:

  • int variable[] = {foo, bar, baz} 仅支持作为初始值设定项,不支持赋值。
  • 不能先声明再在另一个地方初始化数组吗?
  • @user1939432 不,你不能,除非你通过显式设置每个条目来初始化它。 array[0][0] = 77;

标签: c multidimensional-array


【解决方案1】:

您必须在单个语句中声明和初始化数组。

int array[STUDENTS][EXAM]={ { 77, 68, 86, 73 },{ 96, 87, 89, 78 },{ 70, 90, 86, 81 } };

如果您确实需要将数组与声明分开初始化,那么您需要通过单独设置每个成员来实现这一点。

array[0][0] = 77;
...

【讨论】:

  • 不,你不知道(如果你的编译器支持 C99 复合文字);见大卫的回答。
  • @KeithThompson 语义略有不同。使用复合文字,您不会初始化预先声明的数组;您正在初始化一个新数组,然后将其地址分配给一个指针。
  • 是的,你是对的。您根本无法分配给数组。 (我知道,我真的做到了!)
【解决方案2】:

在 C99 中,您可以使用复合文字:

int (*array)[EXAM];
array = (int[STUDENTS][EXAM]){ { 77, 68, 86, 73 },{ 96, 87, 89, 78 },{ 70, 90, 86, 81 } };

编辑:正如格雷厄姆所说:在这里,您没有初始化预先声明的数组;您正在初始化一个新数组,然后将其地址分配给一个指针

【讨论】:

  • 这很可能是 OP 正在寻找的,但它的语义与问题所问的略有不同。使用复合文字,您不会初始化预先声明的数组。您正在初始化一个新数组,然后将其地址分配给一个指针。
  • @GrahamBorland 好点!!
  • @GrahamBorland:sizeof array 的工作方式并非您可能天真地期望的那样。
  • 评论是短暂的;我建议将信息编辑到您的问题中。
  • @KeithThompson,谢谢,已编辑
【解决方案3】:

array={ { 77, 68, 86, 73 ... }; 不是有效的语法。

这种类型的表达式应该在初始化时使用,像这样:

int myArray[5] = { 0 };

查看此question,了解数组初始化的概览。

【讨论】:

  • 这是 C 中所有数组声明的必要条件吗?还是只针对多个下标数组?
  • @user1939432 您不必使用初始化程序,但不能在赋值语句中使用它(这适用于所有数组)。正如格雷厄姆在他的回答中所说,您必须在其声明之外使用正常的赋值语法对其进行初始化。
  • 不,你不知道(如果你的编译器支持 C99 复合文字);见大卫的回答。 @user1939432:适用于所有数组;多维数组只不过是数组的数组。
  • 但是对于一维数组我可以这样做:int array2[STUDENTS]; for(i=0;i
  • @user1939432:是的,对于二维数组,您可以使用嵌套的 for 循环来做同样的事情。
猜你喜欢
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 2012-01-07
  • 2013-06-01
  • 1970-01-01
相关资源
最近更新 更多