【发布时间】:2016-02-23 10:40:09
【问题描述】:
我在尝试在 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 用于声明 test 时的值只能在运行时知道,但令我惊讶的是,VS2015 再次抱怨,但 gcc 和 clang 编译了它.. .
甚至添加以下内容:
int main()
{
int i = getchar();
int test[i];
printf("%d\n", sizeof(test) / sizeof(int));
return 0;
}
在ASCII表中输入值为120的字符x,输出120。
发生了什么事?
【问题讨论】:
-
这在技术上是可行的,因为数组位于栈顶。但我不打算使用这个功能。
-
int test[i];不会初始化数组 -int test[i] = {};会。我相信你的意思是“声明”。 -
@molbdnilo 谢谢,我会编辑
-
@UnTraDe 使用常识。你所有的 4 个例子都是完美的 C,在过去的 17 年里一直如此。然而,Visual Studio 会错误地给您错误和警告。至于来源,请参阅this。直到 2015 年,他们才升级为支持 1999 标准。据我所知,支持还远未完成。 VS 根本就不是一个好的 C 编译器。
标签: c arrays visual-studio gcc clang