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

9
在Visual Studio 2010中,这个初始化工作是按预期进行的:
char table[2][2] = {
                       {'a', 'b'},
                       {'c', 'd'}
                   };

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

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

Visual Studio 报错说该数组可能不包含‘那个’类型的元素,在编译后,VS报告了两个错误:一个缺少索引和太多的初始化。

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

2个回答

14

只有最内层的维度可以省略。数组元素的大小是根据给定给数组变量的类型推导出来的。因此,元素的类型必须具有已知的大小。

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

不被允许的:

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

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


6
换句话说,虽然数组本身的大小可能未知,但元素的大小不能未知? - Miroslav Cetojevic
啊,好的,谢谢你提供这个信息。经过进一步的思考,它似乎很合乎逻辑,不是吗?;-) - Miroslav Cetojevic

0

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

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

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


这是一个不错的解决方案。但不是我在寻找的答案。还是谢谢你向我展示了一个很酷的技巧。 :-) - Miroslav Cetojevic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接