网站建设资讯

NEWS

网站建设资讯

c语言函数的内存分布 c语言内存分为几个区

C语言问题:内存的分配方式有哪几种?

内存分配方式有三种:

公司主营业务:成都网站设计、网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联公司推出吉木乃免费做网站回馈大家。

[1]从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

[2]在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

[3]从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块。

C语言中内存分布及程序运行加载过程

一个程序内存分配:

下图是APUE中的一个典型C内存空间分布图(虚拟内存)

例如:

int g1=0, g2=0, g3=0;

int max(int i)

{

int m1=0,m2,m3=0, p_max;

static n1_max=0,n2_max,n3_max=0;

p_max = (int )malloc(10);

printf("打印max程序地址\n");

printf("in max: 0xx\n\n",max);

printf("打印max传入参数地址\n");

printf("in max: 0xx\n\n",i);

printf("打印max函数中静态变量地址\n");

printf("0xx\n",n1_max); //打印各本地变量的内存地址

printf("0xx\n",n2_max);

printf("0xx\n\n",n3_max);

printf("打印max函数中局部变量地址\n");

printf("0xx\n",m1); //打印各本地变量的内存地址

printf("0xx\n",m2);

printf("0xx\n\n",m3);

printf("打印max函数中malloc分配地址\n");

printf("0xx\n\n",p_max); //打印各本地变量的内存地址

if(i) return 1;

else return 0;

}

int main(int argc, char **argv)

{

static int s1=0, s2, s3=0;

int v1=0, v2, v3=0;

int p;

p = (int )malloc(10);

printf("打印各全局变量(已初始化)的内存地址\n");

printf("0xx\n",g1); //打印各全局变量的内存地址

printf("0xx\n",g2);

printf("0xx\n\n",g3);

printf("======================\n");

printf("打印程序初始程序main地址\n");

printf("main: 0xx\n\n", main);

printf("打印主参地址\n");

printf("argv: 0xx\n\n",argv);

printf("打印各静态变量的内存地址\n");

printf("0xx\n",s1); //打印各静态变量的内存地址

printf("0xx\n",s2);

printf("0xx\n\n",s3);

printf("打印各局部变量的内存地址\n");

printf("0xx\n",v1); //打印各本地变量的内存地址

printf("0xx\n",v2);

printf("0xx\n\n",v3);

printf("打印malloc分配的堆地址\n");

printf("malloc: 0xx\n\n",p);

printf("======================\n");

max(v1);

printf("======================\n");

printf("打印子函数起始地址\n");

printf("max: 0xx\n\n",max);

return 0;

}

打印结果:

ELF目标文件格式的最前端是 ELF****文件头(****ELF Header****) ,

包含了描述整个文件的基本属性,如ELF版本、目标机器型号、 程序入口地址 等

3 加载:

c语言内存有几种分配方式?

基本上C程序的元素存储在内存的时候有3种分配策略:

静态分配

如果一个变量声明为全局变量或者是函数的静态变量,这个变量的存储将使用静态分配方式。静态分配的内存一般会被编译器放在数据段或代码段来存储,具体取决于实现。这样做的前提是,在编译时就必须确定变量的大小。 以IA32的x86平台及gcc编译器为例,全局及静态变量放在数据段的低端;全局及静态常量放在代码段的高端

自动分配

函数的自动局部变量应该随着函数的返回会自动释放(失效),这个要求在一般的体系中都是利用栈(Stack)来满足的。相比于静态分配,这时候,就不必绝对要求这个变量在编译时就必须确定变量的大小,运行时才决定也不迟,但是C89仍然要求在编译时就要确定,而C99放松了这个限制。但无论是C89还是C99,都不允许一个已经分配的自动变量运行时改变大小。

所以说C函数永远不应该返回一个局部变量的地址。

要指出的是,自动分配也属于动态分配,甚至可以用alloca函数来像分配堆(Heap)一样进行分配,而且释放是自动的。

动态分配

还有一种更加特殊的情况,变量的大小在运行时有可能改变,或者虽然单个变量大小不变,变量的数目却有很大弹性,不能静态分配或者自动分配,这时候可以使用堆(Heap)来满足要求。ANSI C定义的堆操作函数是malloc、calloc、realloc和free。

使用堆(Heap)内存将带来额外的开销和风险。

在C语言中,如何给函数分配内存?

不知lz有没听说过虚存一说,当源码被编译成二进制文件后,其中的变量,函数的虚拟地址,也就是内存空间中的地址就已确定,在运行时,操作系统为其分配物理内存并添加虚拟地址到物理地址的映射。

再说的多一点,一个进程(运行的程序)可分为若干段:代码段、数据段、堆栈段等,其中函数所操作的空间(也就是局部变量的空间)就位于堆栈段,所谓函数分配内存大小,实际就是堆栈段指针的变化而已。


网站标题:c语言函数的内存分布 c语言内存分为几个区
文章路径:http://cdweb.net/article/dogpspp.html