【问题标题】:How does memory allocation in malloc differs from that of an array?malloc 中的内存分配与数组的内存分配有何不同?
【发布时间】:2023-04-01 04:42:01
【问题描述】:

我写过这样的代码:

int * ptr;
ptr = (int*) malloc(5 * sizeof(int));

请告诉我如何使用这个 malloc 函数将内存分配给“ptr”? 它与整数数组中的内存分配有何不同?

【问题讨论】:

标签: c


【解决方案1】:

C 标准对此非常明确。

  1. ptr 指向的内存具有动态存储时长

  2. int foo[5]; 关联的内存,例如具有自动存储持续时间

两者之间的主要区别在于,在动态情况下,您需要在完成后调用ptr 上的free 以释放内存,而foo 将在它消失后自动释放范围

在这两种情况下获取内存的机制是故意留给编译器的。

为了进一步研究,谷歌我斜体的术语。

【讨论】:

    【解决方案2】:

    1。用语言回答

    存储时间不同。如果你使用一个整数数组,它可能在文件范围内(在任何函数之外):

    int arr[5];
    

    这具有静态存储持续时间,这意味着对象在程序的整个执行时间内都处于活动状态。

    另一种可能性是在函数内部:

    void foo(void)
    {
        int arr[5];
    }
    

    此变体具有自动存储持续时间,因此只要程序执行在此函数内(更一般地说:在变量的范围内,即封闭的大括号对内),对象才处于活动状态:{ ... })

    如果您改用malloc(),则该对象具有动态 存储持续时间。这意味着决定对象的存活时间。在您调用 free() 之前,它会一直存在。

    2。根据操作系统回答

    malloc() 通常在 上实现。这是地址空间的一个区域,您的程序可以在其中动态地向操作系统请求更多内存。

    相比之下,对于具有 自动 存储持续时间的对象,典型的实现将其放置在 堆栈 上(其中为每个函数调用创建一个新框架)并且具有 static 存储时长,它从一开始就在你程序的一个数据段中。

    这部分答案故意有点含糊; C 实现存在于各种各样的系统中,而 stackheapdata segment 用于许多具有虚拟内存管理的现代操作系统,它们绝不是必需的 - 例如嵌入式平台和微控制器,您的程序可能在没有任何操作系统的情况下运行。因此,编写可移植的 C 代码时,您应该(大部分时间)只对语言指定的内容感兴趣。

    【讨论】:

      猜你喜欢
      • 2012-12-26
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 2020-12-14
      • 2013-02-23
      • 2016-02-13
      • 2012-07-28
      • 1970-01-01
      相关资源
      最近更新 更多