这是在C中声明数组的有效方法吗?

这是在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

我知道你不应该用一个变量来声明数组,比如size ex.
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
    }