VLA 和通过 malloc 进行动态内存分配有什么区别?

Ale*_*ies 5 c malloc pointers initialization variable-length-array

我很好奇这个:

有什么区别:

const int MAX_BUF = 1000;
char* Buffer = malloc(MAX_BUF);
Run Code Online (Sandbox Code Playgroud)

和:

char Buffer[MAX_BUF];
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 9

并且,阵列是一样的指针,和C-FAQ具有很好的收集详细的原因

在可用性和行为方面的主要区别是:

  1. (1) 在堆栈上,通常是Note,而 (2) 在堆上,总是。
  2. (1) 分配后具有固定大小,(2) 可以调整大小。
  3. (1) 在调用封闭函数时分配并且具有块范围 OTOH,(2) 在运行时动态分配内存,并且返回的内存具有从分配到释放的生命周期。
  4. (1)分配的内存不需要由程序员管理,而在(2)中所有malloc()d内存都应该是free()d。[ ]Courtesy: Giorgi

注:维基

例如,GNU C 编译器在堆栈上为 VLA 分配内存。


gio*_*gim 5

除了其他人所说的之外,我还将添加一些有关内存管理的信息。

1)主要区别在这里:

const int MAX_BUF = 1000;
char* Buffer = malloc(MAX_BUF);
Run Code Online (Sandbox Code Playgroud)

您需要手动管理分配的内存,例如,Buffer在使用完毕后将其释放。忘记free它(或释放它两次)可能会导致麻烦。

2)对于第二种情况:

char Buffer[MAX_BUF];
Run Code Online (Sandbox Code Playgroud)

你不需要释放任何东西。它将自动被销毁。因此,您可以避免处理内存的任务 - 这很好。您应该始终尝试评估您需要哪种方法。

一些要点。

  • 由于第二个是在堆栈上分配的,因此当需要创建大型数组时也会采用第一种方法 - 因为堆上通常有更多的内存可用。
  • 此外,如果您使用第二种方法(例如在方法中)创建数组,则对象的生命周期将是该方法 - 您将无法在该方法之外使用该数组。而动态分配则并非如此。