【发布时间】:2014-12-31 09:53:25
【问题描述】:
我一直都知道,如果不使用malloc和free,就无法在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;
}
我知道这不是一个真正的动态数组,因为在声明后无法更改“数组”的大小,也无法通过调用free() 来释放它,但我仍然认为静态数组必须在编译时知道,这显然不是这里的情况..
【问题讨论】:
-
它被称为 VLA(可变长度数组)。它是在 C99 中引入的
-
是什么让你认为它是一个静态数组?我在任何地方都看不到“静态”关键字。正如 Cool Guy 所解释的那样,“你一直都知道的事情”并不总是真实的事情。
-
据我所知,“静态数组”是指在 main() 执行之前分配的数组,这是您在代码中使用的每个固定大小数组的情况
-
@user2318607 : 数组
array[]未分配在 main 执行之前,并非每个固定大小的数组 .static存储类说明符不是 dynamic 的 相反。在这种情况下,array[]具有auto存储类 - 它在进入它所在的函数的入口时分配在堆栈上。在这种情况下,因为它在函数main()中,它恰好具有与static的 相似 生命周期。 -
@CoolGuy :您确实应该将答案发布为答案而不是 cmets。这显然是一个答案。
标签: c arrays variable-length-array