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

Declaring an array on the stack in C (VS2015)

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

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

    return 0;
}

产生 "Expression must have a constant value" 错误,这是我所期望的,但是在 Linux 机器上使用 gcc 和 clang 编译相同的代码是可行的。起初我认为这可能是编译器推断的东西,所以我尝试了以下操作:

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

    return 0;
}

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

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

    return 0;
}

编译器肯定无法推断出这个,​​用于声明testi的值只能在运行时知道,但令我惊讶的是,VS2015再次抱怨,但gcc然后 clang 编译了它... 甚至添加以下内容:

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

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

    return 0;
}

然后在ASCII table中输入值为120的字符x,输出120.

怎么回事?

您遇到了 VLAs (Variable-Length Arrays).
与 "usual" 数组相反,它们采用在 运行时 确定的值作为大小说明符。

由于VS2015主要支持C89,C99引入了VLA,Visual Studio不支持,报错

注意 VLA 是 C 的一个特性。C++ does not support them.