2014-12-31 21 views
0

我一直都知道,如果不使用mallocfree就不可能在C中构建动态数组,那为什么这段代码编译和运行正确?C中的静态数组

#include <stdio.h> 
#include <stdlib.h> 


int main() 
{ 
    int a; 
    printf("Insert a number: "); 
    scanf("%d", &a); 

    int array[a]; 
    int i; 
    for(i=0; i<a; i++) 
    { 
     array[i] = rand(); 
    } 

    for(i=0; i<a; i++) 
    { 
     printf("%d\t", array[i]); 
    } 
    puts(""); 
    return 0; 
} 

我明白,既然没有办法改变的“数组”的大小已经宣布后,这是不是一个真正的动态数组,也可以释放callling free()但我仍然一直以为在编译时必须知道静态数组的大小,这在这里显然不是这样的。

+7

它被称为VLA(可变长度阵列)。它是在C99中引入的 –

+0

是什么让你认为它是一个静态数组?我无法在任何地方看到“静态”关键字。正如Cool Guy所解释的那样,“你一直都知道的事情”并不总是真实的事情。 – gnasher729

+0

据我所知,“静态数组”意味着在执行main()之前分配的数组,这就是您在代码中使用的每个固定大小数组的情况。 – woggio

回答

1

你正在使用的是variable length array。这是由C99和后者支持的。但请注意,VLA具有自动存储持续时间,不同于由malloc家族功能分配的动态存储器。

另请注意,编译时间分配不等于static数组。数组和静态分配是不同的。

+1

*但请注意,它的范围仅限于声明的函数,与动态分配不同。*您正在混合词法范围和存储持续时间。 – ouah