C进阶 - 内存四驱模型

作者: 红橙Darren | 来源:发表于2018-05-09 23:58 被阅读716次
    一.内存四驱模型

    不知我们是否有读过 《深入理解 java 虚拟机》这本书,强烈推荐读一下。在 java 中我们将运行时数据,分为五个区域分别是:程序计数器,java 虚拟机栈,本地方法栈,java 堆,方法区。

    在 c/c++ 中我们将运行时数据,分为四个区域分别是:栈区,堆区,数据区,代码区。我们详细来介绍下:

    1. 栈区:由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
    2. 堆区:一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收。
    3. 数据区:存放全局变量、静态变量和常量字符串等等。 程序结束后由系统释放。
    4. 存放函数体的二进制代码。
    二.模型案例详解

    有时会想就算知道了 c/c++ 的内存四驱模型,好像也没啥作用,这东西背一下就好了,其实不然。我们来看一个实例:

    char* getStr(){
      char buff[128];
    
      strcpy(buff,"12345");
    
      return buff;
    }
    
    void main(){
      char* str = getStr();
    
      printf("%s",str);
    
      getchar();
    }
    

    请问上面这个会打印啥?接下来我们再来看个实例:

    // 求数组的大小
    int size(int arr[]){
      int size = sizeof(arr) / sizeof(int);
      return size;
    }
    
    void main(){
      int arr[] = {1,2,3,4,5,6};
    
      // 求数组的大小
      int size = sizeof(arr) / sizeof(int);
    
      printf("size = %d\n",size);
    
      size = size(arr);
    
      printf("size = %d\n",size);
    
      getchar();
    }
    

    请问上面两个 size 的值是多少?接下来我们再来看个实例:

    char* getStr1(){
        char* str = "12345";
        return str;
    }
    
    char* getStr2(){
        char* str = "12345";
        return str;
    }
    
    void main(){
    
        char* str1 = getStr1();
    
        char* str2 = getStr2();
    
        printf("%d , %d",str1,str2);
    
        getchar();
    }
    

    请问上面 str1 和 str2 的地址值是否会一样?相信只要我们真正的理解了 c/c++ 的内存四驱模型,那么这些问题就迎刃而解了,当然这些还只是第一步,关键还在于对指针的理解。

    视频地址:https://pan.baidu.com/s/1gMzvvfP8nFj9wJ6VZgSnkQ
    视频密码:3ti3

    相关文章

      网友评论

        本文标题:C进阶 - 内存四驱模型

        本文链接:https://www.haomeiwen.com/subject/whrarftx.html