C语言内存四区

C语言内存四区

                          图一:内存四区模型

流程说明
1、操作系统把物理硬盘代码load到内存
2、操作系统把c代码分成四个区
3、操作系统找到main函数入口执行

一:内存四区

一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap: 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回   收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

3、数据区:主要包括静态全局区和常量区,如果要站在汇编角度细分的话还可以分为很多小的区。
                      全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区                             域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后有系统释放
                      常量区 :常量字符串就是放在这里的。 程序结束后由系统释放

4、代码区:存放函数体的二进制代码。

二:相关代码解读

     char*fa()
     {

           char*pa = "123456";//pa指针在栈区,“123456”在常量区,该函数调用完后指针变量pa就被释放了
           char*p = NULL;     //指针变量p在栈中分配4字节
           p=(char*)malloc(100);//本函数在这里开辟了一块堆区的内存空间,并把地址赋值给p
           strcpy(p, "wudunxiong 1234566");//把常量区的字符串拷贝到堆区
           return p;//返回给主调函数fb(),相对fa来说fb是主调函数,相对main来说,fa(),fb()都是被调用函数
    }
    char*fb()
    {
       char*pstr = NULL;
       pstr = fa();
       return pstr;//指针变量pstr在这就结束
    }

    void main()
    { 
         char*str = NULL;
         str = fb();
         printf("str = %s\n",str);
         free(str);    //防止内存泄露,被调函数fa()分配的内存存的值通过返回值传给主调函数,然后主调函数释放内存
         str = NULL;//防止产生野指针
         system("pause");
    }

三:总结

1、主调函数分配的内存空间(堆,栈,全局区)可以在被调用函数中使用,可以以指针作函数参数的形式来使用

2、被调用函数分配的内存空间只有堆区和全局区可以在主调函数中使用(返回值和函数参数),而栈区却不行,因为栈区函数体运行完之后

这个函数占用的内存编译器自动帮你释放了。

3、一定要明白函数的主被调关系以及主被调函数内存分配回收,也就是后面接下几篇总结的函数的输入输出内存模型。

4、sizeof测量的就是在栈区和堆区的字长,比如讲,在一个结构体中,存在一个 static int a 的成员,sizeof是不会计算a的这四个字节长度,因为static静态数据成员是在数据区内,不在sizeof的测量范围内。