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

时间:2015-07-03 06:03:29

标签: c pointers initialization malloc variable-length-array

我很好奇:

之间有什么不同:

const int MAX_BUF = 1000;
char* Buffer = malloc(MAX_BUF);

char Buffer[MAX_BUF];

4 个答案:

答案 0 :(得分:2)

  • 案例1:

     char Buffer[MAX_BUF];
    

    Buffer 数组 ,大​​小为MAX_BUF。分配技术称为VLA

  • 案例2:

    const int MAX_BUF = 1000;
    char* Buffer = malloc(MAX_BUF);
    

    Buffer是一个 指针 ,它被分配了一个大小为MAX_BUF的内存1000

    < / LI>

并且,数组与指针相同,C-FAQ has a Very Good collection detailing the reasons

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

  1. (1)在堆栈上,通常是 Note ,而(2)总是在堆上。
  2. (1)一旦分配了固定大小,(2)可以调整大小。
  3. (1)在调用封闭函数时分配,并具有块作用域OTOH,(2)在运行时动态分配内存,返回的内存的生命周期从分配延伸到解除分配。
  4. (1)分配的内存不需要由程序员管理,而在(2)中所有malloc() d内存都应该是free() d。 [礼貌:Giorgi ]
  5. 注意:Wiki

      

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

答案 1 :(得分:2)

char* Buffer = malloc(MAX_BUF);

创建char指针Buffer,通过MAX_BUF动态分配malloc个字节的内存,并使Buffer指向已分配空间的开头。这个内存在堆上分配。

char Buffer[MAX_BUF];

创建一个大小为Buffer的数组MAX_BUF,其中最多可包含MAX_BUF个字符。请注意,您要创建Variable Length ArrayC99中引入的功能),因为MAX_BUF是一个变量。可以在堆栈上创建此数组。

答案 2 :(得分:2)

除了别人说的话,我还会在内存管理方面添加一些信息。

1)主要区别在于:

const int MAX_BUF = 1000;
char* Buffer = malloc(MAX_BUF);

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

2)第二种情况:

char Buffer[MAX_BUF];

你不需要任何东西。它会自动销毁。因此,您可以避免处理内存的任务 - 这很好。 您应该尝试总是评估您需要的方法。

有些观点。

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

答案 3 :(得分:0)

最显着的差异是范围。 VLA数组仅在声明它的范围内有效,而动态数组将在程序中的任何位置可用,直到您调用free()

实际上,如果编译器使用VLA的堆栈分配,则VLA可能比动态内存更快。但是,C标准没有规定分配VLA。

(编译器理论上可以在堆上分配VLA,但编译器也负责清理。我不认为存在任何此类解决方案。我使用过的每个编译器总是在堆栈上声明VLA。)

这意味着VLA不适合保存大量数据:您可能会面临堆栈溢出的风险。但是,当您使用动态内存时,这不是一个问题。

由于非常古老的编译器不支持VLA,因此VLA不具备与动态阵列相同的可移植性。从理论上讲,新的C11编译器也不必支持VLA,尽管此时我知道没有编译器愚蠢到足以放弃这种支持。

比较/总结

  • 当存在少量本地数据时,应使用VLA,因为它们具有快速分配时间和自动清理。
  • 当存在大量数据时,应使用动态数组,以防止堆栈溢出。
  • 当数据需要在执行函数后保留并在程序的其他位置可用时,应使用动态数组。
  • 当您有特殊和/或无理的可移植性要求时,应使用动态数组。