在C中声明堆栈上的数组(VS2015)

UnT*_*aDe 2 c arrays gcc clang visual-studio

当我尝试在C中声明堆栈上的数组时,我遇到了一个奇怪的问题.我一直认为(至少到现在为止)如果没有常量表达式就不可能在堆栈上声明数组.例如,尝试在Windows上的VS2015上编译以下代码:

int main()
{
    int i = 3;
    int test[i];

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

产生"表达式必须具有常量值"错误,这是我所期望的,但是在Linux机器上使用gcc和clang编译相同的代码是有效的.起初我以为这可能是编译器推断的东西,所以我尝试了以下内容:

int main()
{
    int i = 3;
    int j = i*i;
    int test[j];

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

VS2015再次抱怨同样的错误,但是gcc和clang编译得很好!我立即想,好吧也许这些编译器也在推断它,毕竟它只是"不变"的表达式.所以我尝试了以下方法:

int main()
{
    int i = getchar();
    int test[i];

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然编译器无法推断这一点,i用于声明的test值只能在运行时知道,但令我惊讶的是,VS2015再次抱怨,但是gcc和clang编译了它......甚至添加了以下内容:

int main()
{
    int i = getchar();
    int test[i];

    printf("%d\n", sizeof(test) / sizeof(int));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

x在ASCII表中输入其值为120的字符,输出120.

这是怎么回事?

cad*_*luk 5

您遇到沃拉斯(V ariable- 大号 ength 一个 rrays).
与"通常"数组相反,它们将在运行时确定的值作为大小说明符.

由于VS2015主要支持在C99中引入C89和VLA,因此Visual Studio不支持它们并且发出错误.

需要注意的是沃拉斯是C的特点C++并没有支持他们.