为啥初始化多维数组时不能完全省略维度?
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[][];
会有未知数量的元素未知大小。
元素的大小是强制性的,编译器需要它来访问元素(通过指针算法)。
【讨论】:
换句话说,虽然数组本身的大小可能是未知的,但元素的大小不可能是未知的? 啊,好的,感谢您提供的这些信息。经过进一步的思考,它似乎只是合乎逻辑的,就像它总是那样,不是吗? ;-)以上是关于为啥初始化多维数组时不能完全省略维度?的主要内容,如果未能解决你的问题,请参考以下文章