为啥允许我在 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 限定变量作为数组大小?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 const 限定变量被接受为 gcc 上的初始化程序?

C++ | const修饰的变量

const 在c及c++中应用

C#中const用法详解

C++中加const与不加const的区别

这是在 C 中适当使用 const 限定符吗?