可以在c的运行时确定数组的大小吗?

17 c arrays size memory-management definition

据我所知,在编译c的时间之前,数组需要具有特定的大小.

我想知道为什么这段代码仍然有效?

int s;
printf("enter the array size: ");
scanf("%d",&s);

int a[s]; // Isn't s value determined at run time?
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 22

需要使用ANSI 89 C了解数组大小.规范的99版本删除了此限制并允许使用可变大小的数组.

这是没有此功能的GNU版本的文档

  • @JaredPar 链接已损坏。 (4认同)

P.P*_*.P. 7

C99以来,可变长度数组一直是 C 语言的一部分。但是它们在C11 中是作为可选特性制作的——这意味着符合 C11 的实现不需要提供它(尽管实际上所有支持 C99 的实现肯定都在 C11 中提供了 VLA)。

您可以使用宏检查您的实现是否不提供 VLA __STDC_NO_VLA__(如果它是在 C99 或 C11 编译模式中定义的,那么您的实现不支持 VLA)。

因此,在现代 C (>= C99) 中可以在运行时决定数组大小,并且像下面这样的代码很好:

int s;
printf("Enter the array size: ");
scanf("%d", &s);
int a[s];
Run Code Online (Sandbox Code Playgroud)

VLA 的一个明显缺点是 ifs非常大并且分配a可能会失败。更糟糕的是,没有办法检查分配是否失败,并且您将遇到运行时错误(例如,段错误)。它本质上是未定义的行为。因此,如果数组大小太大,您希望避免 VLA。基本上,如有疑问,请进行动态内存分配(见下文)。

与其他问题相比,VLA 的另一个问题要轻得多,因为它们具有自动存储持续时间(也称为“堆栈分配”)。因此,如果您想要持续时间更长的东西,然后是声明 VLA的块作用域,那么 VLA 就没有帮助了。

同样相关的是C89 中没有 VLA ,。所以使用动态内存分配是唯一的方法。虽然,有一些非标准的扩展,例如alloca()类似于 VLA 并具有与 VLA 相同的缺点)。

int s;
printf("enter the array size: ");
scanf("%d",&s);
int *a = malloc(s * sizeof *a);
...
free(a);
Run Code Online (Sandbox Code Playgroud)


div*_*eek 5

如果需要分配具有动态大小的数组,则必须使用malloc()从堆中获取它.

int *a = (int*)malloc(sizeof(int) * s)
Run Code Online (Sandbox Code Playgroud)

  • 如果删除`(int*)`强制转换,如果忘记包含定义`malloc`的文件,编译器将生成错误.因此,最好不要包括演员. (2认同)
  • `int *a = malloc(s * sizeof *a)` (2认同)