您的位置:首页 > 编程语言 > C语言/C++

C语言中内存区分配

2013-08-28 11:31 176 查看
1 。 每次都会遇到这个问题,一直是看了又忘,忘了又看。本文主要简介一下c中的内存类型和布局问题。

      2。内存的类型

      (1)栈区(stack):由编译器自动分配和释放的,存放函数的参数值、局部变量的值等。操作方式类似数据结构中的栈。

               在函数参数和地址入栈情况中,一般是从左向右将变量入栈,最后函数的地址入栈。

      (2)堆区(heap):由程序员手动分配和释放,完全不同于数据结构中的堆,分配方式类似链表。即由malloc或new来分配,free和delete释放。

      (3)全局区(静态区):全局变量和静态变量的内存是存储放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,

程序员结束后由系统释放。

      (4)文字常量区:常量字符串放在这里。程序结束时系统释放。

      (5)程序代码区:存放函数体的二进制代码。

      下面是一段程序代码,具体说明:

      int a = 0;                      //存放在全局初始化区

      char *p1;                     //存放在全局未初始化区

      int main()

      {

      int b;                      //存放于堆栈中,即栈中。

      char s[] = "abc";            //存放于堆栈中, 即栈中。

      char *p2;                      //存放于堆栈中,即栈中。

      char *p3 = "123456";           //p3本身是存放在堆栈中,"123456"是存放在常量区中

      static int c = 0;                     //存放在全局初始化区

      p1 = (char*)malloc(10);            //存放在堆中,由程序员手动释放。

      p2 = (char*)malloc(20);            //存放在堆中

      strcpy(p1, "123456");          

      //"123456"在常量区。编译器可能会将它与p3所指向的"123456"优化成一个地方。

      free(p1);

      free(p2);

      }

      3 内存空间分配

              对一个进程的内存空间分配,主要是代码区,静态数据区和动态数据区。c语言中有全局变量,本地变量,静态变量和寄存器变量。

      静态数据区包括了全局变量和静态变量。动态数据区包括了堆,栈(堆栈)数据内容,编译的二进制代码就放在代码区。

      ├———————┤低端内存区域 

      │ …… │ 

      ├———————┤ 

      │ 动态数据区 │ 

      ├———————┤ 

      │ …… │ 

      ├———————┤ 

      │ 代码区 │ 

      ├———————┤ 

      │ 静态数据区 │ 

      ├———————┤ 

      │ …… │ 

      ├———————┤高端内存区域 

      3. 内存泄露问题

             vc6.0里面的一种简单的检测内存泄露的方法。首先包含了下面的头文件

      #define _CRTDBG_MAP_ALLOC 

      #include<stdlib.h> 

      #include<crtdbg.h>

      注意:#include 语句的顺序。如果更改此顺序,所使用的函数可能无法正确工作。

      然后在需要检测内存泄露的地方加入_CrtDumpMemoryLeaks();语句即可。

      调试时使用Debug模式来调用,即会在输出信息的窗口出现相关内存信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: