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

Mir*_*vic 9 c initialization multidimensional-array

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

char table[2][2] = {
                       {'a', 'b'},
                       {'c', 'd'}
                   };
Run Code Online (Sandbox Code Playgroud)

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

char table[][] = {
                     {'a', 'b'},
                     {'c', 'd'}
                 };
Run Code Online (Sandbox Code Playgroud)

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

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

Sté*_*nez 13

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

  • 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[][];将有未知数量的未知大小的元素.

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

  • 换句话说,虽然数组本身的大小可能是未知的,但元素的大小不可能是未知的? (6认同)