C/C++变量定义数组长度问题

有次写C语言忘记了一件事,变量不能定义数组长度,但是我用了之后并没有报错,事后想起来这件事,但是没想通,今天看慕课王数据结构和算法的课程时,发现讲师的代码中也出现了使用变量定义数组长度,一切OK。于是我对c语言和C++分别做了测试,发现都是可以的。之前课本上说的是数组的长度是在编译阶段申请的内存长度。然而。。。。 百度了相似问题之后,有人回答OK,有人回答不OK,争议之处在于“数组的长度是在编译阶段申请的内存长度”。显然,经过测试之后,这是在程序运行过程中动态申请的内存空间。 不解,请专业人士解答。(补充一件事,之前蓝桥杯报名时候我们进行了一次测试,我写的代码在本地运行OK,让别人帮我使用判题系统时候0分,原因就是此处的问题,这个就是第一次遇见这个问题的场景)。

前两个图片说的确实是用变量定义数组长度的(后面再说),黑框里的代码就不是了,那是取arr数组的下标为i的值赋给Te——这无论C或C++都是合法的操作。纯C编译器是不允许用变量定义数组长度的,编译都过不了。而后来的有些C++的编译器允许这样做的,但大多数用来做定义数组长度的变量要用const修饰,叫值不变变量,但纯C编译器即使用const修饰的变量也不允许用来定义数组长度。你说的“C和C++”都是允许的可能是你的编译器是C++兼容C的,时下纯C编译器已经很难遇到了……供参考。追问

不好意思那个他图没截对,这个是慕课的一段代码。  不过现在看应该是gcc/g++对C/C++的编译应该跟以前的不太一样。

温馨提示:内容为网友见解,仅供参考
第1个回答  2017-12-03
“变量不能定义数组长度”是不准确的,应当是“未经赋值的变量不能定义数组长度”。你给的图1、图2中的n都在数组定义前有赋值;图3没有上下文,仅这一段代码,看不出有任何错误。
至于数组的存储空间分配,可以是静态的(视软件版本不同,有的是编译阶段随代码空间一同分配的,有的是在运行初始阶段由进程向系统预申请的),也可以是动态的(程序运行到指定代码域内,动态申请、动态释放)。
第2个回答  2017-12-03
C99标准确实是允许变长数组的,目前gcc也支持。
但C++标准(目前已经是C++17标准)不支持,因为这个东西风险太大。
第3个回答  2017-12-03
可变长数组(VLA)在C99中加入,需要编译器支持C99标准
相似回答