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)
自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)
如果需要分配具有动态大小的数组,则必须使用malloc()从堆中获取它.
int *a = (int*)malloc(sizeof(int) * s)
Run Code Online (Sandbox Code Playgroud)