【发布时间】:2023-04-01 04:42:01
【问题描述】:
我写过这样的代码:
int * ptr;
ptr = (int*) malloc(5 * sizeof(int));
请告诉我如何使用这个 malloc 函数将内存分配给“ptr”? 它与整数数组中的内存分配有何不同?
【问题讨论】:
标签: c
我写过这样的代码:
int * ptr;
ptr = (int*) malloc(5 * sizeof(int));
请告诉我如何使用这个 malloc 函数将内存分配给“ptr”? 它与整数数组中的内存分配有何不同?
【问题讨论】:
标签: c
C 标准对此非常明确。
ptr 指向的内存具有动态存储时长。
与int foo[5]; 关联的内存,例如具有自动存储持续时间。
两者之间的主要区别在于,在动态情况下,您需要在完成后调用ptr 上的free 以释放内存,而foo 将在它消失后自动释放范围。
在这两种情况下获取内存的机制是故意留给编译器的。
为了进一步研究,谷歌我斜体的术语。
【讨论】:
存储时间不同。如果你使用一个整数数组,它可能在文件范围内(在任何函数之外):
int arr[5];
这具有静态存储持续时间,这意味着对象在程序的整个执行时间内都处于活动状态。
另一种可能性是在函数内部:
void foo(void)
{
int arr[5];
}
此变体具有自动存储持续时间,因此只要程序执行在此函数内(更一般地说:在变量的范围内,即封闭的大括号对内),对象才处于活动状态:{ ... })
如果您改用malloc(),则该对象具有动态 存储持续时间。这意味着您决定对象的存活时间。在您调用 free() 之前,它会一直存在。
malloc() 通常在 堆 上实现。这是地址空间的一个区域,您的程序可以在其中动态地向操作系统请求更多内存。
相比之下,对于具有 自动 存储持续时间的对象,典型的实现将其放置在 堆栈 上(其中为每个函数调用创建一个新框架)并且具有 static 存储时长,它从一开始就在你程序的一个数据段中。
这部分答案故意有点含糊; C 实现存在于各种各样的系统中,而 stack、heap 和 data segment 用于许多具有虚拟内存管理的现代操作系统,它们绝不是必需的 - 例如嵌入式平台和微控制器,您的程序可能在没有任何操作系统的情况下运行。因此,编写可移植的 C 代码时,您应该(大部分时间)只对语言指定的内容感兴趣。
【讨论】: