在C中,当我声明一个n
元素a[n]
数组,并且用户输入n
时,它不应该工作,因为数组空间会改变从静态内存到动态内存。
但它有效!为什么?
标准是否已更新或是什么?
答案 0 :(得分:1)
但它有效!为什么?
因为C99引入了variable length arrays。你可以声明动态数组。
如果大小是整数常量表达式 并且元素类型具有已知的常量大小,数组类型不是可变长度 数组类型;否则,数组类型是可变长度数组类型。
答案 1 :(得分:1)
Variable length arrays( VLA )是 C99 功能,因此您使用的编译器支持VLA或在 C99之外支持它 mode作为扩展名,例如gcc和clang。
另一方面, C ++ 标准不支持VLA,但是包括上面列出的那些编译器在内的许多编译器都支持C ++中的VLA作为扩展。我们可以看到它们已添加到 C99 中,只需转到Foreword
部分中的草案C99标准:
[...]上一版的主要变化包括:
并包含以下项目符号:
- 可变长度数组
答案 2 :(得分:1)
C99标准允许使用可变长度数组,这正是您所描述的行为。
编辑:C99不受普遍支持(至少默认情况下)。但是,许多编译器(例如GCC)已将C99标准的子集合并到其默认编译设置中。
如果您想禁用这些功能,可以在GCC中通过在编辑设置中设置-ansi -pedantic
来实现。这可确保ANSI C中不支持的任何内容都会产生错误。