【问题标题】:C: Array declared inside a functionC:在函数内声明的数组
【发布时间】:2013-08-22 11:04:14
【问题描述】:

当我在函数中声明一个数组(结构体)时,内存是在返回后自动释放还是必须手动释放?

mezo pre_tabla[8][8]

【问题讨论】:

  • 你没有分配。所以你没有什么可以释放的。谁做的也将承担后果:P
  • 如果你没有使用malloc()或类似的调用,你不需要使用free()。当调用执行不明显分配的代码(例如在库中)时,需要对此感到厌烦;阅读有关库调用的文档以了解您的要求。

标签: c arrays memory free


【解决方案1】:

函数内部定义将在堆栈中分配内存,一旦函数范围死亡,该内存将被清除。使用动态内存分配将需要单独的空闲调用。

【讨论】:

    【解决方案2】:

    如果您静态声明数组,则无需手动释放它。但是,如果您动态分配数组(通过使用 malloc() 或 calloc()),那么您需要手动释放它。对于前 -

    下面的静态声明:

    struct info {
        char p;
        int x;
    };
    
    struct info arr[10];    // doesn't require to free it.
    

    动态分配如下:

    struct info *c;
    
    c = malloc(sizeof(info) * 10);  // dynamic memory allocation, needs to be freed via free() system call
    

    【讨论】:

      【解决方案3】:

      如果数组未声明为static,则当程序超出声明数组的范围时,应释放内存。

      【讨论】:

      • 如果它声明为静态,根据发布的问题,仍然没有什么可以手动释放。
      • 是的,你是对的。无法手动删除静态变量。我的意思是函数返回后静态变量将保留在堆栈中
      【解决方案4】:

      所有局部变量/结构都在堆栈中分配。

      当你进入函数时,你有一个堆栈指针,用于存储数据的地址与之相关。

      当你从函数返回时,堆栈指针会更新以对应调用者函数,因此可以说内存是自动释放的。

      +----------+
      |          |
      | f1 var1  |<--- f1() stack pointer
      | f1 var2  |
      | f1 arr[0]|
      |  .....   |
      | f1 arr[N]|
      | f2 var1  |<--- f2() stack pointer
      | f2 var2  |
      | f1 arr[0]|
      |  .....   |
      | f1 arr[N]|
      +----------+
      

      【讨论】:

        猜你喜欢
        • 2017-03-25
        • 2015-07-29
        • 2019-12-05
        • 2015-04-12
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多