IDE/编译器数组处理的差异[重复]
Posted
技术标签:
【中文标题】IDE/编译器数组处理的差异[重复]【英文标题】:Differences with IDE/compilers array handling [duplicate] 【发布时间】:2012-09-18 20:35:27 【问题描述】:可能重复:C/C++: Array size at run time w/o dynamic allocation is allowed?
我在一个类中,我们有一个简单的任务来编写一个函数,该函数返回一个指向动态数组的指针并提供一个存根来测试它。我已经完成了这项工作,所以我不会在作业上寻求帮助。在课堂博客上,另一位学生建议很直观地应该能够做到int Array[size];
其中size
显然是用户定义的变量。
我知道在标准 C++ 中,至少根据我的文本,数组必须有一个“常量整数表达式......大于零”作为大小声明符。这对我来说意味着他们的例子不能工作。事实上,使用 VS2010 时,您会遇到三个错误。
但是,他们解释说:
我知道,你知道,甚至我的 Ubuntu 安装中的 g++ 编译器 我的 WinXP 安装上的 Bloodshed 编译器知道这一点。对于某些 “知道”的水平人们会期望“int Array [size];”去工作 (就像之前的两个课程一样)。
但显然它无法在某些人的 VS 编译器上运行。一罐 只假设,因为共同点是 VS(是的,我 通过让朋友在他的盒子上检查来确认这一点),VS 是 问题。几个之一。
因为I know that...
部分指的是我告诉他们不应该有任何理由使用#include <new>
来使用new
,所以已经存在混淆,但似乎他们认为我们同意不应该有任何理由使用new
分配动态数组。(?)
所以问题很明显。是否有任何编译器可以接受int Array[size];
,其中大小不是const int
而不会出错?
【问题讨论】:
查找变长数组。一些编译器将它们作为扩展提供。无论如何,没有需要使用new
。最好只使用矢量。
【参考方案1】:
int Array[size];
其中size
不是常量表达式是可变长度数组。从 1999 年 ISO 标准开始,它们是 C 的标准功能。 C++ 标准没有采用它们,但一些编译器支持它们作为语言扩展。
(任何 C++ 编译器,当以一致性模式调用时,必须至少对具有非常量大小的数组类型发出诊断。)
顺便说一下,这与您使用的 IDE 没有直接关系;它由您的 IDE 调用的编译器控制。
至于#include <new>
,有一个同名的标准标头,但对于语言中内置的new
运算符来说,它不是必需的。 <new>
标头提供了几个重载版本的 operator new
和一些其他声明。
【讨论】:
谢谢-我注意到new
标题并在今天查看了它。那么,您会说使用它是赞成/反对/无关紧要的吗?就是变长数组。
如果您在 C++ 中使用 VLA,您将代码的可移植性限制为支持它作为扩展的编译器。如果没有足够的内存来分配数组,程序的行为是不确定的;无法检测或处理分配失败。根据您的要求,您可能最好使用标准 C 库的功能,例如 <vector>
、<array>
或 <list>
。以上是关于IDE/编译器数组处理的差异[重复]的主要内容,如果未能解决你的问题,请参考以下文章