C语言中的内存管理

与其他语言相比,C语言最大的特点是可以直接操作内存。但是,也因如此让部分程序员对其避而远之。

实际上,C语言里的内存管理是有章可循的。

一个由C语言编译的程序占用的内存可为以下几个部分:

  • 1、栈区(stack)— 存放函数的参数值,局部变量的值等,由编译器自动分配释放内存。
  • 2、堆区(heap)— 这一部分由程序员主动分配,需要程序员手动去释放。
  • 3、全局区(静态区)(static)— 全局变量和静态变量的存储是放在这里。程序结束后由系统释放。
  • 4、文字常量区 — 常量字符串就是放在这里的。程序结束后由系统释放。

由上可知,实际由我们分配和释放的部分只有heap区。而heap区的内存创建主要有两种函数malloc和new,前者来源于C,后者是C++特有的。而我们只需要保证,由这两种函数创建的内存在结束时调用free和delete释放即可。

int a=0;    //全局初始化区
char *p1;   //全局未初始化区
main(){
    int b;//栈
    char s[]="abc";//栈
    char *p2;//栈
    char *p3="123456";//123456\0在常量区,p3在栈上。
    static int c=0;//全局(静态)初始化区
    p1 = (char*)malloc(10);
    p2 = (char*)malloc(20);//分配得来得10和20字节的区域就在堆区。
    strcpy(p1,"123456");//123456\0放在常量区,编译器可能会将它与p3所向"123456"优化成一个地方。
}

Comments