这是在C中声明数组的有效方法吗?
我知道你不应该用一个变量来声明数组,比如size ex.这是在C中声明数组的有效方法吗?,c,declaration,variable-length-array,C,Declaration,Variable Length Array,我知道你不应该用一个变量来声明数组,比如size ex.intarr[n]因为如果不使用动态内存,数组的大小应该是静态的,但是如果有这样的函数呢?这是有效的还是无效的?它似乎运行得很好。。它是在函数中声明的这一事实与它有什么关系吗 int main() { int n; scanf("%d", &n); exampleFunc(n); } void exampleFunc(int const n) { int arr[n]; for (int
intarr[n]代码>因为如果不使用动态内存,数组的大小应该是静态的,但是如果有这样的函数呢?这是有效的还是无效的?它似乎运行得很好。。它是在函数中声明的这一事实与它有什么关系吗
int main() {
int n;
scanf("%d", &n);
exampleFunc(n);
}
void exampleFunc(int const n) {
int arr[n];
for (int i = 0; i < num; i++) {
arr[i] = i + 1;
}
}
intmain(){
int n;
scanf(“%d”和“&n”);
例func(n);
}
void exampleFunc(int const n){
int-arr[n];
for(int i=0;i
提前谢谢你的帮助。我是C语言的noob,我找到的所有资源都是其他语言的。来自
ISO C99中允许使用可变长度的自动阵列
如果您使用的是std=c99
标志,则保证它是有效代码。但是,请记住,可变长度数组(VLAS)不是C++编程的标准部分。这是C99标准中引入的强制性功能
在实现未在C11支持中定义\uuuu STDC\u NO\u VLA\uuuu
标志之前,此功能一直是可选的。对于这个有效的细节。对于初学者来说,for循环中有一个输入错误
for (int i = 0; i < num; i++) {
函数声明应放在其调用之前
用限定符const声明参数没有太大意义
void exampleFunc(int const n);
这两个函数声明
void exampleFunc(int const n);
及
声明同一个函数
此函数中数组的声明
int arr[n];
如果编译器支持可变长度数组,则有效。否则,编译器将发出一个错误,即数组的大小应为整数常量表达式
可变长度阵列应具有自动存储持续时间。因此,即使编译器支持可变长度数组,也不能在任何函数之外声明它们,例如
const int n = 10;
int a[n];
int main( void )
{
//...
}
此外,您不能在声明中初始化可变长度数组
下面是一个使用可变长度数组的演示程序
#include <stdio.h>
void display_pattern( size_t n )
{
for ( size_t i = 0; i < n; i++ )
{
int a[i+1];
for ( size_t j = 0; j < i + 1; j++ ) a[j] = ( i + j ) % n;
for ( size_t j = 0; j < i + 1; j++ ) printf( "%d ", a[j] );
putchar( '\n' );
}
}
int main(void)
{
display_pattern( 10 );
return 0;
}
该语言1999年的修订版引入了可变长度数组,其中可以使用运行时变量而不是编译时变量来指定数组维度。它们涵盖了exampleFunc
中的确切用例,允许您声明一个直到运行时才知道其大小的本地数组,而无需依赖malloc
VLA的使用受到限制-它们不能用作全局变量或声明为静态
,不能在声明中使用初始值设定项,并且不能任意大
VLA支持在C99之后的实现中是参差不齐的,2011年的修订版使其支持成为可选的。为了完全安全,您应该对照语言版本和\uu STDC\u NO\u VLA\uuu
宏进行检查,以确定您的实现是否支持它们2:
不管名称如何,对于任何给定的定义,可变长度数组的大小都是固定的;定义后,无法调整其大小。
就我个人而言,我会改变该功能宏的含义,将其重命名为\uu STDC\u VLA\uu
,并仅在支持VLA的情况下对其进行定义,但我不是标准委员会的成员。
您使用的是可变长度数组,它在C99中有效。这称为可变长度数组,是在C99中引入的。但在更高版本的C标准中,它被标记为可选的。如果实现没有定义\uuuuuu STDC\u NO\uvla\uuuuu
,它也是有效的C11。VLA是C99中的一个强制性功能,在C11中被回滚为“可选”。@trentcl谢谢,我刚才才知道。我已经更新了答案。
const int n = 10;
int a[n];
int main( void )
{
//...
}
#include <stdio.h>
void display_pattern( size_t n )
{
for ( size_t i = 0; i < n; i++ )
{
int a[i+1];
for ( size_t j = 0; j < i + 1; j++ ) a[j] = ( i + j ) % n;
for ( size_t j = 0; j < i + 1; j++ ) printf( "%d ", a[j] );
putchar( '\n' );
}
}
int main(void)
{
display_pattern( 10 );
return 0;
}
0
1 2
2 3 4
3 4 5 6
4 5 6 7 8
5 6 7 8 9 0
6 7 8 9 0 1 2
7 8 9 0 1 2 3 4
8 9 0 1 2 3 4 5 6
9 0 1 2 3 4 5 6 7 8
void exampleFunc( const int n )
{
#if __STDC_VERSION__ >= 199901L && !defined(__STDC_NO_VLA__)
int arr[n];
#else
int *arr = malloc( sizeof *arr * n );
#endif
// do stuff with arr
#if !(__STDC_VERSION__ >= 19901L && !defined(__STDC_NO_VLA__))
free( arr );
#endif
}