请问在这个约瑟夫问题中,把数组定义在main()函数前与下面程序中定义的数组方式 有什么异同?

请问在这个约瑟夫问题中,把数组定义在main()函数前与下面程序中定义的数组方式
有什么异同?
为什么在VC6.0中认为示例程序的数组错误,而在dev C++中却没事

 #include <iostream>
#include <iomanip>  //调用setw()函数
using namespace std;
//bool str[101];
int main()
{
    int n, m;
    cin >> n >> m; //n为人数, m为报数数字
    bool str[n+1];
    cout << endl;
    for(int i=1;i<=101;++i)
    {
        str[i] = false; //相当于memset(str, 0, sizeof(str))
    }
    int a = 1, s = 1, f=1;
    do
    {
        ++a;
        if(a==n+1)      //模拟环状
            a=1;
        if(str[a]==false)
            ++f;
        if(f==m)
        {
            f = 0;      //计数器清零
            ++s;
            str[a] = true;
            cout << a << setw(5) << endl; //输出并设置域宽
        }
    }while(s!=n);
    return 0;
}

在函数(main或者其他函数)外部定义的数组都是全局数组,但是只有在定义以后的函数中才能访问。
在函数中定义的是局部数组,也是仅在函数中定义以后的代码块中才能访问。
bool str[n+1]的确是不合法的。数组定义时,长度必须时常量。如果需要跟具n来确定数组的大小,需要用到动态分配内存的malloc或者new,当然申请的资源最后需要调用free或者delete[]释放。

在main函数前定义的是全局数组,一般在静态存储区。
在main函数中定义的是局部数组,一般在堆中。
bool str[n+1]在标准c++中是不合法的,数组长度不能是变量。
但有的编译器认为合法。

c里面数组的定义数组长度不能放变量

1l,说的有错,在main函数中定义的是局部数组,一般在栈中。

全局数组与局部数组生存期也不同(区别很多,这里我只说这一个)。全局数组你可以在任何地方用,局部的就只能在此函数内部用。