代码之家  ›  专栏  ›  技术社区  ›  keser

C动态分配w/指针[重复]

  •  0
  • keser  · 技术社区  · 6 年前

    我很好奇:

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

    以及:

    char Buffer[MAX_BUF];
    
    0 回复  |  直到 9 年前
        1
  •  3
  •   Community Dunja Lalic    7 年前
    • 案例1:In

       char Buffer[MAX_BUF];
      

      Buffer 是一个 大小 MAX_BUF . 分配技术称为 VLA .

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

      缓冲器 指针 它被分配了一个大小的内存 最大值 1000 .

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

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

    1. 注意 ,当(2)在堆中时,始终。
    2. (1) 在调用封闭函数并具有块作用域OTOH时分配,(2)在运行时动态分配内存,并且返回的内存具有从分配到释放的生存期。
    3. (1) 分配的内存不需要由程序员管理,而在(2)all malloc() d内存应该是 free() d。 [ 礼貌: Giorgi

    注: Wiki

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

        2
  •  2
  •   Spikatrix    9 年前
    char* Buffer = malloc(MAX_BUF);
    

    char 指针 Buffer ,动态分配 MAX_BUF 通过 malloc 使 缓冲器 指向已分配空间的开头。这个内存是在堆上分配的。

    char Buffer[MAX_BUF];
    

    创建数组 缓冲器 大小 最大值 最多可容纳 最大值 Variable Length Array (在 C99 )自从 最大值 是一个变量。此数组可以在堆栈上创建。

        3
  •  2
  •   Giorgi Moniava    9 年前

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

    1) 主要区别在于:

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

    您需要手动管理分配的内存,例如 Buffer 当你用完它的时候。忘记 free 它(或释放两次)可能会导致麻烦。

    2) 对于第二种情况:

    char Buffer[MAX_BUF];
    

    你不需要释放任何东西。它会被自动销毁。因此,您可以避免处理内存的任务—这是很好的。

    一些要点。

    • 另外,如果您使用第二种方法创建数组,例如在方法中,对象的生命周期将是该方法-您将无法在该方法之外使用该数组。而动态分配则不是这样。
        4
  •  1
  •   Lundin Makoto    8 年前

    最显著的区别是范围。VLA数组只在声明它的作用域内有效,而在调用 free() .

    (编译器在理论上可以在堆上分配一个VLA,但是编译器也将负责清理。我不认为存在这样的解决方案。我使用的每个编译器都会在堆栈上声明VLAs。)

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

    VLAs没有动态数组那样的可移植性,因为非常旧的编译器不支持VLAs。理论上,新的C11编译器也不必支持VLAs,尽管在这一点上,我知道没有一个编译器愚蠢到可以放弃这种支持。


    比较/总结:

    • 当有大量数据时,应该使用动态数组,以防止堆栈溢出。
    • 当数据在函数执行后需要持久化并且在程序的其他地方可用时,应该使用动态数组。