我写了这样的代码:
int * ptr;
ptr = (int*) malloc(5 * sizeof(int));
请告诉我内存如何分配给" ptr"使用这个malloc函数? 它与整数数组中的内存分配有何不同?
答案 0 :(得分:6)
存储持续时间不同。如果使用整数数组,则它可能位于文件范围内(在任何函数之外):
int arr[5];
这具有静态存储持续时间,这意味着该对象在程序的整个执行时间内处于活动状态。
另一种可能性是在函数内部:
void foo(void)
{
int arr[5];
}
此变体具有自动存储持续时间,因此只要程序执行在此函数内,对象就是活动的(更一般地说:在变量范围内,这是一对括号) :{ ... }
)
如果您使用malloc()
,则该对象具有动态存储持续时间。这意味着你决定对象的存活时间。它会一直存在,直到你打电话给free()
。
malloc()
通常在堆上实现。这是地址空间的一个区域,您的程序可以从操作系统中动态请求更多内存。
相反,对于具有自动存储持续时间的对象,典型的实现将其放置在堆栈(其中为每个函数调用创建新帧)并且使用< em>静态存储持续时间,它将从一开始就存在于程序的数据段中。
答案的这一部分故意有点模糊; C实现存在于各种各样的系统中,而 stack , heap 和数据段在许多具有虚拟内存管理的现代操作系统中使用,它们绝不是必需的 - 例如,您的程序可以在没有任何操作系统的情况下运行的嵌入式平台和微控制器。因此,编写可移植的C代码时,您应该(大多数时候)只对该语言指定的内容感兴趣。
答案 1 :(得分:4)
C标准非常明确。
ptr
指向的内存动态存储时间。
与int foo[5];
相关联的内存,比如自动存储时间。
两者之间的主要区别在于,在动态情况下,您需要在free
上调用ptr
以便在完成内存后释放内存,而foo
将在范围之后自动释放。
在任何一种情况下获取内存的机制都是故意留给编译器的。
为了进一步研究,谷歌使用了 italicised 的条款。