见本测试程序:为什么我可以进入alloca:d变量的范围,但不是可变长度的数组?
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
if (argc < 2)
goto end;
char s[strlen(argv[1]) + 1];
strcpy(s, argv[1]);
printf("s=%s\n", s);
end:
return 0;
}
它失败,错误“跳与可变类型的标识符的范围”来编译(见other question)。
但是它编译罚款,如果我改变的s
申报到这一点(包括alloca.h
):
char *s = alloca(strlen(argv[1]) + 1);
为什么C标准允许跳跃与012创建的对象的范围,而不是可变长度数组?我认为它们是相同的。
'alloca'不在标准中,因此编译器可以像处理任何其他函数一样对待它(尽管它们[通常不会]](http://man7.org/linux/man-pages/man3/alloca.3 .html#NOTES)),在这种情况下,根据标准,这一切都很好。虽然,它可能会导致类似的未定义行为 – Kninnug