我尝试在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.
发生了什么事?
答案 0 :(得分:5)
您遇到了VLA( V ariable- L ength A rrays)。
而不是"通常"数组采用运行时确定的值作为大小说明符。
由于VS2015主要支持在C99中引入C89和VLA,因此Visual Studio不支持它们,并且发出错误。
注意,VLA是C C++ does not support them.
的一项功能