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

时间:2011-09-15 14:48:24

标签: c multidimensional-array initialization

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

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

但是写下这样的内容似乎不合法:

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

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

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

2 个答案:

答案 0 :(得分:13)

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

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

不允许:

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

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

答案 1 :(得分:0)

这是可接受的解决方法吗?

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

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