1静态存储区域分配
内存分配在程序编译之前完成,并且存在于程序的运行过程中,例如全局变量、静态变量等。
2栈分配
函数执行时,函数内部的局部变量存储单元。在栈上创建的,这些存储单元会在函数执行结束时自动释放。
3堆分配
堆分配(也称为动态内存分配)。程序在运行时使用malloc或new来申请内存,程序员使用free或delete来释放它动态内存的生存期是由我们决定的。
扩展信息
在堆栈上分配数组
#include
usingnamespaced;
voidmain()
{
int**arr=NULL;//int类型二-维数组
输入,列;
>row;//2>column;//3//请在此处编写代码,根据行和列拆分堆栈上的数组字符串
...您的代码..
//给数组元素赋值
for(introwIndex=0;rowIndex { for(intcolumnIndex=0;columnIndex { arr[rowIndex][columnIndex]=columnIndex+(rowIndex+1)*1000+1; } } //打印每个数组元素 for(rowIndex=0;rowIndex { for(intcolumnIndex=0;columnIndex <{ printf("%d",arr[rowIndex][columnIndex]); } printf("\n"); } } 需要一个数组来存储用户输入,但是我们不知道用户会输入多少条数据。 (1)数组设置太大,会浪费内存 问题:如何做到足够,但又不至于浪费? 系统中有一个内存管理器(MM,MemoryManager),它负责管理一个空闲内存池。它就是为了解决此类问题而设计的。 MM提供的服务:应用程序可以向MM申请(借用)一定大小的内存,使用后释放(归还)。 当应用程序使用malloc时,必须将返回值转换为目标类型。 这个内存和数组没有根本的区别,而且它们的用法是完全一样的。 首先需要计算一下需要多少字节的内存空间 一个数组的例子: 释放的时候需要注意,因为之后for循环执行完毕,p地址已经向前移动了10,所以必须先减10再释放p,否则会有问题 //销毁时只需要释放一次。malloc一些字节后,会释放一些字节,不管是char类型还是int类型 在一个函数中动态分配内存,在另一个函数中操作这块内存。function (1)MM是系统级的东西,所有应用程序都从同一个MM申请内存。 (2)什么是信用?事实上,当内存被借出时,MM只是简单地标记它所管理的内存,表明该内存已经被占用。比如记录每段占用的内存(首地址,长度) (3)MM为非常大方:①只要有人用,就同意借出;②如果你不归还,他们绝不会免费向你索要。 (4)MM管理的内存区域称为Heap 这意味着用户程序必须及时感到空闲,这样才不会滞后于其他应用程序的使用。如果有一个应用程序继续被误用但没有被释放,它最终会耗尽MM内存。当MM没有更多的空闲内存时,malloc返回NULL,表明内存耗尽。 再次强调:malloc后,申请应尽快释放! 使用原则:需要时重新申请,不需要时立即释放 CurrentActive,MM识别借用内存块 所以在释放时每个块内存的首地址是不同的,只需指定即可。第一个地址。 对象引用的一段内存 示例:用Citizen代表公民,用Machine代表汽车。 什么才算“准时”? MM中可用的内存是有限的,当你使用它的时候,你应该尽快归还它,因为其他应用程序也需要MM。记忆。 只借不归,积累到一定程度后,MM已经没有更多的可用内存了,所以malloc返回NULL。 如果要返回,必须完整返回,否则MM无法处理 原因是:MM此时可能没有空闲内存可用。(虽然这种情况一般不会出现) 释放后,内存返回给MM,内存不再可用(voided) 一定不能在同一个函数中释放,该发布在应用程序的每个角落都有效。 也就是说:这部分内存被销毁后,就完全留给你随意处置了 功能:将s中当前位置之后的n个字节(typedefunsignedintsize_t)替换为ch并且returns 参数: 参数: 功能:从src指向的内存区域复制n个字节到dest指向的内存区域。 memmove()函数与memcpy相同(区别是:当dest 函数:它的作用是在内存的动态存储区域中分配一块长度为size的连续空间。它的参数是一个无符号整数,它的返回值是一个指针,指示所分配的持久存储区域的起始地址。 2.释放功能:因为内存空间总是有限的,所以不能无限制地分配,而且程序必须尽量节省资源,所以当分配的内存区域不使用时,必须将其释放。以便其他变量或程序使用它。这时候我们就要用到free函数了。 函数:其作用是在动态内存存储区域中分配n个连续的大小为length的空间。该函数返回一个指向已分配区域起始位置的指针,如果分配不成功则返回NULL。 扩展信息: 函数运算符: 新运算符 new用于向系统申请动态存储空间,首地址作为运算结果。它的使用模型是: 指针变量=新数据类型;例: int*p=newint 这条语句的作用是用new从内存中实现一个int类型(4个字节)的变量,并赋值给它的首地址给定指针变量p的变量。 new创建的变量初始值是一个随机值,也可以在用new分配内存时进行初始化。典型用法是: 指示变量=新数据类型(初始值)。 删除 堆内存可以根据需要分配。软件的内存要求可能随时发生变化。有时程序可能无法返回内存,因为需要新分配的空间,并且程序尚未完成运行。这时,必须将之前占用的内存空间释放到堆内存,然后重新分配以供程序的其他部分使用。删除操作符用于释放为新对象分配的内存空间并将其删除。其使用模型为: 删除指针变量 指针变量保留新分配的第一块内存地址 参考:--动态内存分配
二、C语言-动态分配内存malloc&free
(2)设置太小,不够用
free(p);
(p0,n0)(p1,n1)(p2,n2)...
(p0,n0)(p1,n1)(p2,n2)...
内部保证每两个内存块不会“重叠”,即也就是说,不会有重叠,一部分内存不会同时被两个应用程序借用
和src指示的内存空间重叠时,memmove()可以处理,但是执行)。效率比memcpy()低
三、C语言中的动态内存分配的用法举例
上一篇:内存分配方式有哪些
下一篇:内存分配方式与内存分配算法