这两种方法中哪一种是为静态数组提供维度的正确方法?

exs*_*ake 2 c arrays dimension variable-length-array

这两种形式的数组声明是否正确?

第一:

int n;
n=3;
int A[n];
Run Code Online (Sandbox Code Playgroud)

第二:

#define N 300;
.
.
.
.
int a[N];
Run Code Online (Sandbox Code Playgroud)

对我来说,这两种方式完全有效,但有人告诉我,第一种方式是错误的.

第一个就是说:

int A[10];
Run Code Online (Sandbox Code Playgroud)

所以,对我来说,说第一个无效是没有多大意义的.

但要完全确定,我想在这里问一下.它只是关于编程风格还是第一个不是正确的方式?

谢谢.

Sha*_*our 6

您的第一个示例使用称为可变长度数组(VLA)的C99功能,这在草案C99标准部分6.7.5.2 数组声明符第4段中有所介绍:

[...]如果size是一个整型常量表达式,并且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型; 否则,数组类型是可变长度数组类型.

这两种形式都不一定是坏的,但如果可以通过用户输入控制它们的大小,则可变长度数组可能是危险的.主要的问题是并非所有的编译器都支持C99,最好的例子是Visual Studio,尽管最近开始支持C99的部分,据我所知仍然不支持VLA.如果你想在C++中使用你的代码也是一个问题,因为C++标准根本不支持VLA,尽管gccclang支持VLA作为C++的扩展.请注意,VLA是针对C++ 14提出的,但被拒绝了.

另一个问题是C11使VLA成为可选功能,这在C11草案标准部分6.10.8.3 条件特征宏中有所涉及:

_ _STDC_NO_VLA_ _   The integer constant 1, intended to indicate that the
                    implementation does not support variable length arrays or
                    variably modified types.
Run Code Online (Sandbox Code Playgroud)