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

时间:2016-02-23 10:40:09

标签: c arrays visual-studio gcc clang

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

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

    return 0;
}

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

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

    return 0;
}

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

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

    return 0;
}

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

test

输入ASCII表中值为120的字符int main() { int i = getchar(); int test[i]; printf("%d\n", sizeof(test) / sizeof(int)); return 0; } ,输出120.

发生了什么事?

1 个答案:

答案 0 :(得分:5)

您遇到了VLA( V ariable- L ength A rrays)。
而不是"通常"数组采用运行时确定的值作为大小说明符。

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

注意,VLA是C C++ does not support them.

的一项功能