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

标签 c pointers initialization malloc variable-length-array

我对此很好奇:

有什么区别:

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

和:

char Buffer[MAX_BUF];

最佳答案

  • 情况 1:在

     char Buffer[MAX_BUF];
    

    Buffer是一个大小为 MAX_BUF数组 。分配技术称为 VLA

  • 情况 2:在

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

    Buffer是一个分配了大小为 MAX_BUF 的内存的指针这是 1000 .

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

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

  1. (1) 通常位于堆栈上,注意,而 (2) 始终位于堆上。
  2. (1) 一旦分配就具有固定大小,(2) 可以调整大小。
  3. (1) 在调用封闭函数时分配,并且具有 block 作用域 OTOH,(2) 在运行时动态分配内存,并且返回的内存具有从分配到释放的生命周期。
  4. (1)分配的内存不需要由程序员管理,而在(2)中所有malloc() d 内存应该是 free() d. [礼貌:Giorgi ]
<小时/>

注意:Wiki

For example, the GNU C Compiler allocates memory for VLAs on the stack.

关于c - VLA 和通过 malloc 进行动态内存分配有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49728384/

相关文章:

c - 排列器不产生字典输出

c - 为什么C更接近硬件?

c - 如何访问另一个结构体中的结构体字段指针并正确写入?

c - (内核简单编程)我想知道为什么pid会这样显示

c - NDK - 扩展类并使用指向数组的指针会导致段错误

c++ - Direct3D typedef 用法

c++ - 错误(std::bad_array_new_length) in a 2d array textbook example (Absolute C++, Savitch)

c++ - main 中静态类变量的初始化

c++ - 如何在 lambda 捕获列表中创建指针?

c++ - 包含未初始化值的对象 vector