为啥初始化多维数组时不能完全省略维度?

Posted

技术标签:

【中文标题】为啥初始化多维数组时不能完全省略维度?【英文标题】:Why can't I omit the dimensions altogether when initializing a multi-dimensional array?为什么初始化多维数组时不能完全省略维度? 【发布时间】:2011-11-17 23:17:26 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

这是一个不错的解决方案。但不是我正在寻找的答案。不过,感谢您向我展示了一个很酷的技巧。 :-)【参考方案2】:

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

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

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

【讨论】:

换句话说,虽然数组本身的大小可能是未知的,但元素的大小不可能是未知的? 啊,好的,感谢您提供的这些信息。经过进一步的思考,它似乎只是合乎逻辑的,就像它总是那样,不是吗? ;-)

以上是关于为啥初始化多维数组时不能完全省略维度?的主要内容,如果未能解决你的问题,请参考以下文章

初始化 C/C++ 多维数组时忽略大小

由线到面:二维数组,多维数组

将多维数组解析为完全指定的端点

多维数组

为啥多维数组第一维的大小可以是任意的

C# - 更改多维数组元素类型