C语言动态申请内存函数 c语言动态内存分配malloc( 二 )


// 当销毁时只需要free一次,malloc了几个字节就会free几个字节,和char类型还是int类型无关
free(p);
在一个函数中动态分配的内存,在另一个函数中操作这块内存
(1) MM是一个系统级的东西,所有的应用程序都向同一个MM申请内存 。
(2) 何为借出?实际上 , 在内存被借出时,MM只是把它管理的内存标记了一下,表示该段内存已经被占用 。比如,它把每一段被占用的内存给记录下来(首地址,长度)
(p0,n0) (p1, n1) (p2, n2) ...
(3) MM非常慷慨:①只要有人 malloc  , 它都同意借出 ②你不归还 , 它永远不会主动要求你 free。
(4) MM管理的内存区域称为“堆”Heap
这意味着,用户程序应该自觉得及时 free,以便不耽误别的应用程序的使用 。如果有个应用程序不停地 malloc ,而不 free,那最终会用光MM的内存 。当MM没有更多闲置内存时,malloc 返回 NULL,表示内存已经用完 。
再次重申: 应用程序在malloc之后,应该尽早free !
使用原则:需要的时候再申请,不需要的时候立即释放
实际上,MM对借出的内存块进行标识
(p0, n0) (p1, n1) (p2, n2) ...
它内部已经保证任意两块内存不会“交叠”,即不会重叠,不会把一块内存同时借给两个应用程序使用 。
所以 , 每块内存的首地址都是不同的,在 free 的时候只需要指明首地址即可 。
对象指的一块内存
示例:用Citizen表示一个市民,用Car表示一个辆车 。他起初没有车 , 但未来可能有一辆车 。
怎么样才算“及时”? “不及时”会怎样?
MM里可用的内存是有限的,你用完了就得尽快还,因为别的应用程序也需要MM的内存 。
只借不还,积累到一定程度,MM没有更多内存可用,于是malloc返回NULL 。
要还就得全还 , 否则MM那边处理不了
原因是:MM可能此时没有闲置内存可用 。(虽然这种情况一般不会发生)
free之后,该内存交还给MM,该内存不再可用(失效)
不一定要在相同的函数里释放 , 在应用程序的任意一个角落释放都是有效的 。
也就是说:这一块内存被malloc出来之后 , 完全交给你处置
功能:将 s 中当前位置后面的 n 个字节 (typedef unsigned int size_t )用ch替换并返回s
参数:
参数:
功能:由 src 所指内存区域复制 n 个字节到 dest 所指内存区域 。
memmove() 功能用法和 memcpy()) 一样,区别在于: dest
和 src 所指的内存空间重叠时,memmove() 仍然能处理,不过执行效率比 memcpy() 低一些
c语言中malloc是什么?怎么用?malloc() 函数用来动态地分配内存空间,其原型为:void* malloc (size_t size);
说明:
【参数说明】
size 为需要分配的内存空间的大小 , 以字节(Byte)计 。
【函数说明】
malloc() 在堆区分配一块指定大小的内存空间,用来存放数据 。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的 。如果希望在分配内存的同时进行初始化,请使用 calloc()() 函数 。
【返回值】
分配成功返回指向该内存的地址,失败则返回 NULL 。
操作:
由于申请内存空间时可能有也可能没有,所以需要自行判断是否申请成功,再进行后续操作 。
如果 size 的值为 0 , 那么返回值会因标准库实现的不同而不同,可能是 NULL,也可能不是,但返回的指针不应该再次被引用 。
注意:函数的返回值类型是 void *,void 并不是说没有返回值或者返回空指针 , 而是返回的指针类型未知 。所以在使用 malloc() 时通常需要进行强制类型转换,将 void 指针转换成我们希望的类型,例如:

推荐阅读