首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在c中初始化n维数组时必须显式地指定n-1维?

为什么在c中初始化n维数组时必须显式地指定n-1维?
EN

Stack Overflow用户
提问于 2013-10-10 00:24:26
回答 1查看 125关注 0票数 4

我知道我可以显式地初始化一个一维数组,如下所示:

代码语言:javascript
复制
int a1d[] = {0, 1, 2, 3, 4, 5};

这个数组将有确切的6个元素- sizeof(a1d) / sizeof(a1d[0])告诉我的。

我试图用一个二维(或更多)维数组来完成这个任务:

代码语言:javascript
复制
int a2d[][] = {{0, 1, 2}, {3, 4, 5}};

但gcc在error: array type has incomplete element type上犯了错误。从初始化过程中可以明显看出,这是一个2x3数组,但这似乎是不允许的--这是为什么?

相反,我必须指定除一个维度之外的所有维度:

代码语言:javascript
复制
int a2d[][3] = {{0, 1, 2}, {3, 4, 5}};

我理解,如果我要将一个n维数组传递给一个函数,那么在函数中指定n-1维是绝对必要的,正如这个问题Why do we need to specify the column size when passing a 2D array as a parameter?所解释的那样,但是对于显式初始化的情况,它就不那么明显了。这仅仅是一个标准的限制,还是有一个令人信服的技术原因,我错过了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-10 00:40:56

一个原因是允许使用这样的初始化器初始化数组:

代码语言:javascript
复制
= { { 1 }, { 2, 3 }, { 4, 5, 6 } };

提供每个初始化程序并不是强制性的。实际上,通过指定的初始化器,这可能成为:

代码语言:javascript
复制
= { [23] = { 1 }, [9] = { 2, 3 }, [3] = { [13] = 4, [99] = 5, [0] = 6 } };

因此,作为初始化程序的数组至少必须是:

代码语言:javascript
复制
int a[24][100];

在某种程度上,它可以追溯到C的古老历史,当时编译器必须安装到64 KiB内存中,等等。编译器推断数组大小所需的额外工作,可能对机器的容量来说太大了(特别是与用户明确指定他们想要的数组大小的成本相比,节省的类型是最小的)。

注意:“允许”并不意味着“推荐”。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19285028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档