C语言内存分配问题

C/C++编译的程序占用的内存分为以下几个部分:


   1.栈区(stack)-----程序运行时由编译器自动分配,程序结束时由编译器自动释放。存放函数的参数、局部变量、返回数据、返回地址等值。

   2.堆区(heap)-----在内存中开辟另一块存储区域,一般由程序员分配,若程序员不释放,程序结束时可能由OS回收,与数据结构中的堆不是一回会事,分配方式类似于链表。

   3.全局区(static)---编译器编译时即分配内存。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和静态变量在相邻的                                           另一块区域(BSS).程序结束后由系统释放。

   4.文字常量区----常量字符串存放在这里,程序结束后由系统释放。

   5.程序代码区----存放函数体的二进制代码


------

        A. 全局变量在程序开始时就分配内存,  而静态局部变量在对应函数第一次执行时分配内存.


        B. 全局变量能被各个函数访问, 所以一般用于传递数据.  静态局部变量只能被定义它的函数访问,  一般用于保存特定数据.

 

-------
jtextarea 固定大小

内存分配方式有三种:

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

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

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


申请方式:

       stack:由系统自动分配,例如,声明在函数中一个局部变量int b,系统自动在栈中为b开辟空间。

       heap:需要程序员自己申请,并指明大小在c中是malloc函数,在C++中是new运算符

                     如p1=(char*)malloc(10); //p2=new char[10];

                      注意p1和p2本身是在栈中的

申请后系统的响应:

             栈:只要栈的剩余空间大于所申请的空间,系统将为系统提供内存,否则将报异常提示栈溢出

             堆:操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删                      除,并将该结点的空间分配给程序。--由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

申请大小限制:

            栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域。栈的大小是在编译时就确定的常数,为2M有的也说是1M。

            堆:是向高地址扩展的数据结构,是不连续的内存区域。

你可能感兴趣的:(C语言内存分配问题)