在C语言中 , 如何给函数分配内存?函数的相对地址在编译链接的时候就已经分配好了,但是绝对地址是未知的 。就是说,函数的地址相对于程序基址的偏移是确定的 , 但是程序在运行的时候,会被加载到哪一个区域运行是不确定的,需要由操作系统根据内存的使用的情况等进行调度,所以函数在内存中的绝对地址也就自然不确定了 , 希望可以帮到你 。
C语言中分配内存要实现根据程序的需要动态分配存储空间c语言函数内存分配,就必须用到以下几个函数
1、malloc函数
malloc函数的原型为:
void
*malloc
(u
igned
int
size)
其作用是在内存的动态存储区中分配一个长度为size的连续空间 。其参数是一个无符号整形数c语言函数内存分配,返回值是一个指向所分配的连续存储域的起始地址的指针 。还有一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针 。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作 。
下例是一个动态分配的程序:
#include
#include
main()
{
int
count,*array;
/*count是一个计数器,array是一个整型指针,也可以理解为指向一个整型数组的首地址*/
if((array(int
*)
malloc(10*sizeof(int)))==NULL)
{
printf("不能成功分配存储空间 。");
exit(1);
}
for
(count=0;count〈10;count)
/*给数组赋值*/
array[count]=count;
for(count=0;count〈10;count)
/*打印数组元素*/
printf("-",array[count]);
}
上例中动态分配c语言函数内存分配了10个整型存储区域,然后进行赋值并打印 。例中if((array(int
*)
malloc(10*sizeof(int)))==NULL)语句可以分为以下几步:
1)分配10个整型的连续存储空间,并返回一个指向其起始地址的整型指针
2)把此整型指针地址赋给array
3)检测返回值是否为NULL
2、free函数
由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以当所分配的内存区域不用时 , 就要释放它,以便其它的变量或者程序使用 。这时c语言函数内存分配我们就要用到free函数 。
其函数原型是:
void
【c语言函数内存分配 c语言分配内存malloc】free(void
*p)
作用是释放指针p所指向的内存区 。
其参数p必须是先前调用malloc函数或calloc函数(另一个动态分配存储区域的函数)时返回的指针 。给free函数传递其它的值很可能造成死机或其它灾难性的后果 。
注意:这里重要的是指针的值,而不是用来申请动态内存的指针本身 。例:
int
*p1,*p2;
p1=malloc(10*sizeof(int));
p2=p1;
……
free(p2)
/*或者free(p2)*/
malloc返回值赋给p1,又把p1的值赋给p2,所以此时p1,p2都可作为free函数的参数 。
malloc函数是对存储区域进行分配的 。
free函数是释放已经不用的内存区域的 。
所以由这两个函数就可以实现对内存区域进行动态分配并进行简单的管理了 。
c语言分配内存方式有哪些内存分配方式有三种:
1、从静态存储区域分配 。内存在程序编译的时候就已经分配好 , 这块内存在程序的整个运行期间都存在 。例如全局变量,static变量 。
2、在栈上创建 。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放 。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限 。
3、从堆上分配,亦称动态内存分配 。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存 。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它 , 否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块 。
C语言中的动态内存分配的用法举例1、malloc函数:其作用是在内存的动态存储区中分配一个长度为size的连续空间 。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针 。
2、free函数:由于内存区域总是有限的 , 不能不限制地分配下去,而且一个程序要尽量节省资源 , 所以当所分配的内存区域不用时,就要释放它,以便其它的变量或者程序使用 。这时我们就要用到free函数 。
3、calloc函数:其作用是在内存的动态存储区中分配n个长度为 size 的连续空间 。函数返回一个指向分配区域的起始位置的指针c语言函数内存分配;如果分配不成功,则返回NULL 。
扩展资料:
函数运算符:
new
运算符new用于向系统申请动态存储空间,并把首地址作为运算结果 , 它的使用形式为:
指针变量=new 数据类型c语言函数内存分配;
例如:
int *p=new int
该语句的作用是会用new从内存中申请了一个int型变量(4个字节),并将该变量的首地址赋给指针变量p 。
new所建立的变量的初始值是任意的,也可在用new分配内存的同时进行初始化 。使用形式为:
指针变量=new 数据类型(初始值) 。
delete
堆内存可按照要求进行分配,程序对内存的需求量随时会发生变化,有时程序在运行种可能会不再需要由new分配的内存空间,而且程序还未运行结束,这时就需要把先前占用的内存空间释放给堆内存,以后重新分配,供程序的其他部分使用 。运算符delete用于释放new分配的内存空间 , 删除建立的对象,它的使用形式为:
delete 指针变量;
其中的指针变量中保存着new分配的内存的首地址 。
参考资料:百度百科--动态内存分配
c语言函数内存分配的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于c语言分配内存malloc、c语言函数内存分配的信息别忘了在本站进行查找喔 。
推荐阅读
- postgresql性能对比的简单介绍
- 爱阁工房是如何营销的,爱阁工房全屋定制加盟
- 电脑微信直播助理怎么弄,电脑版微信直播怎么打开
- java算圆的面积的代码 javabean求圆面积
- 淘宝币怎么放在手机桌面,淘宝币怎么放在手机桌面上
- 视频号直播没人微信怎么办,微信视频号直播不进人怎么回事
- 美发网站制作,美发教程最全的网站
- auxlinux命令 linux aux什么意思
- 如何使用淘宝上的产品推广,如何使用淘宝上的产品推广赚佣金