在Linux或Windows下定义数组时的区别

时间:2010-11-16 17:10:47

标签: c++

这是一个定义数组的简单代码。我注意到这个代码在Linux(OpenSue,gcc编译器)下可以工作(编译和运行),但它在Windows系统下不起作用。编译器提供了错误提示。有人知道原因吗?谢谢!

#include <iostream>
using namespace std;

int main()
{
    int N;
    cin>>N;
    int ar[N];
    ar[0]=0;
    cout<<"ar[0]= "<<ar[0]<<endl;
    return 0;
}

4 个答案:

答案 0 :(得分:12)

代码无效C ++,因为C ++不允许像您一样声明具有可变大小的(堆栈分配的)数组。这样做的原因是C ++提供了更好的机制来声明动态大小的数组,使用标准库中的std::vector类:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int N;
    cin >> N;
    vector<int> ar(N);
    ar[0] = 0;
    cout << "ar[0] = " << ar[0] << endl;
    return 0;
}

g++(您在Linux上使用的编译器)默认允许通过编译器扩展。

答案 1 :(得分:2)

这本身并不是Linux和Windows之间的区别。这是gcc和MS VC ++之间的区别。

这种类型的代码是合法的,在C中允许(从C99开始)。但是,它不允许在C ++中使用 - 但gcc无论如何都将它作为C ++的扩展。在这方面,MS VC ++试图更严格地遵循(C ++)标准,并且不提供这种特定的扩展。

但是,如果您在Windows上运行gcc(例如,CygwinMinGW),您将在Windows上获得与您目前在Linux上观察到的相同的行为。

正如@Konrad Rudolph已经指出的那样,在C ++下处理这个问题的正确方法几乎可以肯定是从使用数组切换到使用向量。

答案 2 :(得分:1)

C ++中不允许使用可变长度数组(例如int ar[N];),但GCC无论如何都可以这样做。

答案 3 :(得分:0)

不确定为什么它在linux中编译,但你不能像那样在堆栈上声明int ar [N]。