C++11和C创建数组时,使用变量来确定数组维度为什么没报错??

给数组创建大小时,可以采用变量来确定数组的维度大小吗?
系统使用window10和Ubuntu16.04。
编译器版本。

  • 在window10采用g++ 5.4.0和gcc 5.1.0

  • 在Ubuntu采用g++ 5.4.0,clang 3.8.0 和gcc 5.1.0

代码如下

c++

#include <iostream>
int main(){
    int size = 5;
    int test[size];
    test[0] = 0;
    cout << test[0] << endl;
    return 0;
}

C

#include <stdio.h>
int main(){
    int size = 5;
    int test[size];
    test[0] = 0;
    printf("%d", test[0]);
    return 0;
}

均可以编译通过,没有任何问题??为什么丫??

阅读 11.5k
6 个回答

@felix 我把来自于felix的评论分享一下吧。跟上面的几个大神说的都是一样的,但是他贴了个官方的文档,所以可能会更清晰完美一些。还是谢谢上面的几个大神的帮助。下面是答案。
参见于gcc官方文档 可以知道,这是一个C99的特性,可以使用变量名来定义数组长度,但是对于C++而言是一个可选特性。
另外,在陈浩的酷客发现了这么一篇文章,对于理解数组乱七八糟的东西还是挺有帮助的。谢谢各位。

这是 C99 标准的一部分,叫做 变长数组变量长度数组

编译器扩展,其他编译器不保证可以

我记得C Primer Plus E6讲过这个问题,是第十章?反正C这么写叫VLA变长数组,当然这个特性在C99是一定要支持,C11改为了可选。
C++是不能这么写的,这里给过,是GCC扩展支持(不过我查了下C++ Primer Plus E6。。。可以有其他方法绕过这个限制耶。。。不过我不会)
(最后感谢评论中那位大佬对我错误观点的更正)

这个特性是gcc的扩展,是C99的必须特性,C11的可选特性,另外C++标准不支持VLA

你的int变量其实是可以在编译的时刻确定的,在gcc5.4里输入的变量也可用来指定数组大小,大概是编译器进化了。以下代码变异和运行都没有问题。

#include <stdio.h>
int main(){
  int n;
  scanf("%d",&n);
  int test[n];
  printf("%d", test[n-1])
  return 0;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题