1 / 4
文档名称:

C语言内存分配问题.doc

格式:doc   页数:4页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

C语言内存分配问题.doc

上传人:wc69885 2016/2/24 文件大小:0 KB

下载得到文件列表

C语言内存分配问题.doc

相关文档

文档介绍

文档介绍:C语言程序编译的内存分配:(stack)--编译器自动分配释放,主要存放函数的参数值,局部变量值等;(heap)--由程序员分配释放;--存放全局变量和静态变量;程序结束时由系统释放,分为全局初始化区和全局未初始化区;--常量字符串放与此,程序结束时由系统释放;--存放函数体的二进制代码例://=0;//全局初始化区char*p1;//全局未初始化区voidmain(){intb;//栈chars[]="bb";//栈char*p2;//栈char*p3="123";//其中,“123\0”常量区,p3在栈区staticintc=0;//全局区p1=(char*)malloc(10);//10个字节区域在堆区strcpy(p1,"123");//"123\0"在常量区,编译器可能会优化为和p3的指向同一块区域}一个C程序占用的内存可分为以下几类:(一)栈这是由编译器自动分配和释放的区域。主要存储函数的参数,函数的局部变量等。当一个函数开始执行时,该函数所需的实参,局部变量就推入栈中,该函数执行完毕后,之前进入栈中的参数和变量等也都出栈被释放掉。它的运行方式类似于数据结构中的栈。(二)堆这是由程序员控制分配和释放的区域,在C里,用malloc()函数分配的空间就存在于堆上。在堆上分配的空间不像栈一样在某个函数执行完毕就自动释放,而是一直存在于整个程序的运行期间。当然,如果你不手动释放(free()函数)这些空间,在程序运行结束后系统也会将之自动释放。对于小程序来说可能感觉不到影响的存在,但对于大程序,例如一个大型游戏,就会遇到内存不够用的问题了(三)全局区C里的全局变量和静态变量存储在全局区。它们有点像堆上的空间,也是持续存在于程序的整个运行期间,但不同的是,他们是由编译器自己控制分配和释放的。(四)文字常量区例如char*c=“123456”;则”123456”为文字常量,存放于文字常量区。也由编译器控制分配和释放。(五)程序代码区存放函数体的二进制代码。(一)inta=0;//全局区voidmain(){intb;//栈chars[]="abc";//s在栈,"abc"在文字常量区char*p1,*p2;//栈char*p3="123456";//"123456"在常量区,p3在栈上staticintc=0;//全局区p1=(char*)malloc(10);//p1在栈,分配的10字节在堆p2=(char*)malloc(20);//p2在栈,分配的20字节在堆strcpy(p1,"123456");//"123456"放在常量区//编译器可能将它与p3所指向的"123456"优化成一个地方。}(二)//返回char型指针char*f(){//s数组存放于栈上chars[4]={'1','2','3','0'};returns;//返回s数组的地址,但程序运行完s数组就被释放了}voidmain(){char*s;s=f();printf("%s",s);//打印出来乱码。因为s所指向地址已经没有数据}还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递归函数