c语言中函数的内存分配 c语言中内存分配方式

C语言中分配内存要实现根据程序的需要动态分配存储空间,就必须用到以下几个函数
1、malloc函数
malloc函数的原型为:
void
*malloc
(u
igned
int
size)
其作用是在内存的动态存储区中分配一个长度为size的连续空间 。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针 。还有一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就会返回一个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]);
}
上例中动态分配了10个整型存储区域,然后进行赋值并打印 。例中if((array(int
*)
malloc(10*sizeof(int)))==NULL)语句可以分为以下几步:
1)分配10个整型的连续存储空间,并返回一个指向其起始地址的整型指针
2)把此整型指针地址赋给array
3)检测返回值是否为NULL
2、free函数
由于内存区域总是有限的,不能不限制地分配下去 , 而且一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放它,以便其它的变量或者程序使用 。这时我们就要用到free函数 。
其函数原型是:
【c语言中函数的内存分配 c语言中内存分配方式】void
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语言内存有几种分配方式?基本上C程序的元素存储在内存的时候有3种分配策略:
静态分配
如果一个变量声明为全局变量或者是函数的静态变量 , 这个变量的存储将使用静态分配方式 。静态分配的内存一般会被编译器放在数据段或代码段来存储,具体取决于实现 。这样做的前提是,在编译时就必须确定变量的大小 。以IA32的x86平台及gcc编译器为例,全局及静态变量放在数据段的低端;全局及静态常量放在代码段的高端
自动分配
函数的自动局部变量应该随着函数的返回会自动释放(失效) , 这个要求在一般的体系中都是利用栈(Stack)来满足的 。相比于静态分配,这时候,就不必绝对要求这个变量在编译时就必须确定变量的大小,运行时才决定也不迟 , 但是C89仍然要求在编译时就要确定,而C99放松了这个限制 。但无论是C89还是C99 , 都不允许一个已经分配的自动变量运行时改变大小 。
所以说C函数永远不应该返回一个局部变量的地址 。
要指出的是,自动分配也属于动态分配 , 甚至可以用alloca函数来像分配堆(Heap)一样进行分配,而且释放是自动的 。
动态分配
还有一种更加特殊的情况 , 变量的大小在运行时有可能改变 , 或者虽然单个变量大小不变,变量的数目却有很大弹性,不能静态分配或者自动分配,这时候可以使用堆(Heap)来满足要求 。ANSI C定义的堆操作函数是malloc、calloc、realloc和free 。
使用堆(Heap)内存将带来额外的开销和风险 。
C语言中的动态内存分配的用法举例1、malloc函数:其作用是在内存的动态存储区中分配一个长度为size的连续空间 。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针 。
2、free函数:由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源 , 所以当所分配的内存区域不用时,就要释放它,以便其它的变量或者程序使用 。这时我们就要用到free函数 。
3、calloc函数:其作用是在内存的动态存储区中分配n个长度为 size 的连续空间 。函数返回一个指向分配区域的起始位置的指针;如果分配不成功,则返回NULL 。
扩展资料:
函数运算符:
new
运算符new用于向系统申请动态存储空间,并把首地址作为运算结果,它的使用形式为:
指针变量=new 数据类型;
例如:
int *p=new int
该语句的作用是会用new从内存中申请了一个int型变量(4个字节),并将该变量的首地址赋给指针变量p 。
new所建立的变量的初始值是任意的,也可在用new分配内存的同时进行初始化 。使用形式为:
指针变量=new 数据类型(初始值) 。
delete
堆内存可按照要求进行分配,程序对内存的需求量随时会发生变化,有时程序在运行种可能会不再需要由new分配的内存空间,而且程序还未运行结束,这时就需要把先前占用的内存空间释放给堆内存,以后重新分配 , 供程序的其他部分使用 。运算符delete用于释放new分配的内存空间 , 删除建立的对象,它的使用形式为:
delete 指针变量;
其中的指针变量中保存着new分配的内存的首地址 。
参考资料:百度百科--动态内存分配
在C语言中,如何给函数分配内存?不知lz有没听说过虚存一说,当源码被编译成二进制文件后,其中的变量,函数的虚拟地址 , 也就是内存空间中的地址就已确定,在运行时 , 操作系统为其分配物理内存并添加虚拟地址到物理地址的映射 。
再说的多一点,一个进程(运行的程序)可分为若干段:代码段、数据段、堆栈段等,其中函数所操作的空间(也就是局部变量的空间)就位于堆栈段,所谓函数分配内存大小 , 实际就是堆栈段指针的变化而已 。
关于c语言中函数的内存分配和c语言中内存分配方式的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读