为什么在初始化多维数组时我不能完全省略维度?

在Visual Studio 2010中,此初始化按预期工作:

char table[2][2] = { {'a', 'b'}, {'c', 'd'} }; 

但是写下这样的东西似乎不合法:

 char table[][] = { {'a', 'b'}, {'c', 'd'} }; 

Visual Studio抱怨此数组可能不包含’that’类型的元素,并且在编译之后,VS报告两个错误:缺少索引和太多初始化。

问题 :为什么在初始化多维数组时我不能完全省略维度?

只能省略最内层的尺寸。 对于给定数组变量的类型,推导出数组中元素的大小。 因此,元素的类型必须具有已知的大小。

  • char a[]; 具有大小为 1(8位)的元素(例如a[0] ),并且具有未知的大小。
  • char a[6]; 具有大小为 1的元素大小为6。
  • char a[][6]; 具有大小为 6的元素(例如a[0] ,它是一个数组),并且具有未知的大小。
  • char a[10][6]; 具有大小为 6的元素大小为60。

不允许:

  • char a[10][]; 将有10 个未知大小的元素。
  • char a[][]; 将有未知数量的未知大小的元素。

元素的大小是必需的,编译器需要它来访问元素(通过指针算术)。

这是一个可接受的解决方案吗?

 char * table [] = { "ab", "cd" }; 

编辑:请注意,它会在每个字符串的末尾添加一个额外的’\ 0’。