在C++中,运行时确定大小的数组是否有效?

5

我正在和朋友交流,帮助她处理一段代码。以前我一直认为数组必须是编译时常量,因为它们在栈上。但她说她的朋友使用了以下代码:

#include <iostream.h>
#include <stdlib.h>
int main()
{
    int value = ' ' ;
    int sum = 0;
    int count = 0;
    cout<<"Please enter the total number of employees" <<endl;;
    cin>> value;
    int numbers[value];
    cout<<"Now enter the employees corresponding salaries" <<endl;;
    for (int k = 0; k < value; k++)
    {
        cin >> numbers[k];
    }
}

他们正在使用Dev-C++。
这段代码应该可以工作吗?我认为不行。

可能是如何在c++中创建一个全局变长数组?的重复问题。 - Seth Carnegie
1
她将value初始化为' '有什么原因吗?编译器不会在意(它会将' '字符转换为其ASCII值,即32),但是将一个整数初始化为32似乎是一个奇怪而随机的数字。 - Jeremy T
他们不是程序员,只是普通的大学生。我无法告诉你为什么她选择了' ',\n本来也可以的。 - jValdron
1
@jValdron:0 应该没问题,int 不是 char... 这就是为什么这看起来对我们很奇怪。 - AJG85
4个回答

9

可变长度数组是在gccg++中的扩展...因此这并不适用于每个编译器。

有关gcc对可变长度数组支持的更多信息,请参见此处的文档


4
我相信在C++中,可变长数组是官方不支持的,但某些编译器和/或语言扩展实现了它们。
如果你想要一个可变长数组,我建议使用std::vector。你可以在这里查看它的参考文档: http://www.cplusplus.com/reference/stl/vector/

2
#include <iostream.h>

^不是标准标题。在标准化之前,即1998年之前,它曾经存在过。例如现代Visual C++中就没有它。

cin>> value;
int numbers[value];

可变长度数组(Variable Length Arrays,或VLAs)是在C99标准发布一年后引入的,因此它们不是最初的C++标准的一部分。令人欣慰的是,在C++11中也没有采用这种方式。可以使用vector头文件中的std::vector等其他标准库容器来代替。

g++支持可变长度数组作为语言扩展,但最好关闭此类扩展功能。例如:

d:\dev\test> g++ foo.cpp

d:\dev\test> g++ -pedantic -std=c++0x -Wall -O foo.cpp
foo.cpp: In function 'int main()':
foo.cpp:11: warning: ISO C++ forbids variable length array 'numbers'
foo.cpp:7: warning: unused variable 'sum'
foo.cpp:8: warning: unused variable 'count'
d:\dev\test> _

0

我尝试使用GCC 4.6编译它,发现你发布的代码成功编译。我还尝试运行它,发现它可以工作,但我认为这段代码不是很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接