当我们在 c 中有更简单的代码时,为什么我们使用 malloc 或 calloc?

Why do we use malloc or calloc when we have a simpler code in c?

#include <stdio.h>

int main() {
    int n = 0, i;
    printf("Enter the size of array\n");
    scanf("%d", &n);
    int a[n];
    for (i = 0; i < n; i++) {
        a[i] = i + 1;
        printf("%d,", a[i]);
    }
}

我可以知道 malloc()calloc() 与此代码之间的区别吗,因为我想两者都满足了需求?

请注意,根据最新标准,VLA 不是规范的强制性部分。分配器函数(malloc() 和系列)是分配内存的标准方法,其大小仅在 run-time.

处已知

引用 C18,第 6.7.6.2/P4 章

[...] (Variable length arrays are a conditional feature that implementations need not support; see 6.10.8.3.)

也就是说,由于 VLA 的性质,它们还有其他使用限制,它们的生命周期仅限于定义的范围内。例如,您不能 return 在函数调用的函数中定义的 VLA,但是如果您使用分配器函数,则可以 return 指针,因为它的生命周期一直保持到以编程方式释放(调用 free()).

int a[n];

a 声明为 variable-length 数组 。 VLA 很有用,但有局限性:

  • 它们不能用 static 关键字或在文件范围内声明;
  • 它们不能在声明中初始化——例如,你不能写类似 int a[n] = {0};;
  • 的东西
  • 他们不能是 structunion 类型的成员;
  • 它们不能任意大;
  • 它们并未得到普遍支持 - 它们是在 1999 年的语言定义修订版中引入的,并在 2011 年的修订版中成为可选的;
  • 它们在定义后无法调整大小 - variable-length 中的“变量”仅表示它们的大小不是从一个定义到下一个定义是固定的。

与任何 auto 变量一样,当您退出其封闭范围时,它们将不复存在。

Dynamically-allocated 内存相对于 VLA 有一些优势:

  • 在您明确 free 之前,内存会一直分配;
  • 您可以分配任意大的内存块;
  • 您可以根据需要调整分配块的大小;
  • 与 VLA 不同,malloccallocrealloc 受任何托管实施的支持;

如果你只需要一个函数内的一些临时工作存储,你不知道它的大小提前,你不需要太多,并且它们受支持,那么 VLA 是一个不错的选择并且比使用 malloccalloc.

更简洁