为啥允许我在 C 中使用 const 限定变量作为数组大小?
Posted
技术标签:
【中文标题】为啥允许我在 C 中使用 const 限定变量作为数组大小?【英文标题】:Why am I being allowed to use a const qualified variable as an array size in C?为什么允许我在 C 中使用 const 限定变量作为数组大小? 【发布时间】:2013-05-11 09:29:19 【问题描述】:当我运行以下代码时,它适用于 C:
#include<stdio.h>
int main(void)
const int x=5;
char arr[x];
printf("%d",sizeof(arr));
但我不仅之前读过const
限定变量不是real
常量(这就是为什么它们不能用于case
条件switch-case
),但以下链接来自 IBM 证实了这一点 (IBMLINK) 并表示:
const int k = 10;
int ary[k]; /* allowed in C++, not legal in C */
那么为什么允许我在 C 中使用 const
限定变量作为数组大小而没有任何错误?
【问题讨论】:
您的 IBM 链接不符合 C 标准。请改用在过去 14 年中更新的 C 引用。 我将标题和文本从“索引”更改为“大小”。仅当您使用数组来指示一个特定成员时,才会使用术语索引。在声明或定义中,您声明了整个对象的大小。 【参考方案1】:c99
支持变长数组但c90
不支持变长数组,如果你使用gcc
并尝试使用这些参数进行编译,你可以更清楚地看到这一点:
gcc -std=c89 -pedantic
这会给你以下警告:
warning: ISO C90 forbids variable length array ‘y’ [-Wvla]
但如果你使用c99
编译,那就完全没问题了:
gcc -std=c99 -pedantic
正如 John Bode 所指出的,从 2011 年开始,C 标准可变长度数组 (VLA
) 现在是可选的。这是一篇关于 VLA 的 Dr Dobbs 文章,也是 Wayne Conrad 指出的 gcc
docs 的链接。
【讨论】:
是不是说c99
下的数组索引也可以是函数的返回?
@Jugni 这应该没问题
我是否应该得出结论,在c99
下没有规定编译器必须知道每个数组的长度?IBM 门户中写到编译器必须知道它。那么你能否确认上次c99
之后没有这个要求?函数的返回,甚至一般的变量(有或没有const
限定符)都可以是数组索引吗?
@Jugni Dobbs 博士的这篇文章详细介绍了这个主题,您可能会发现它很有用drdobbs.com/the-new-cwhy-variable-length-arrays/184401444
@WayneConrad 感谢您提供gcc
文档链接,我已将参考添加到我的答案中。以上是关于为啥允许我在 C 中使用 const 限定变量作为数组大小?的主要内容,如果未能解决你的问题,请参考以下文章