C进阶 - 内存四驱模型

红橙Darren
• 阅读 1437

一.内存四驱模型

不知我们是否有读过 《深入理解 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

本文转自 https://juejin.cn/post/6844903608325144583,如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
kebukeyi kebukeyi
3年前
Jvm的内存布局和垃圾回收机制
内存布局运行时数据区1.程序计数器:用来控制代码运行行数。2.Java虚拟机栈:每个线程运行方法(A调用B)时,先把A方法放入到栈底,然后加载B方法,B
Wesley13 Wesley13
3年前
java运行时数据区
运行时数据区包括以下几个部分:程序计数器,堆,java栈,本地方法栈,方法区1.程序计数器:当CPU需要执行指令时,需要从程序计数器中获取当前需要执行的指令所在存储单元的地址。用来指示执行哪条指令。其大小不会随程序的执行而发生改变。2.Java栈:java方法执行的内存模型。存放的时一个个栈帧,每个栈帧对应一个被调用的方法。  栈帧中包括:局
Wesley13 Wesley13
3年前
java的对象模型
java中的对象在内存中,究竟是怎样一种存在?这篇随笔,我们就来一探究竟。可能不够深入,但是我们把理解到位,深入到我们需要的程度这样即可。先来看下jvm的内存模型:程序计数器虚拟机栈和本地方法栈堆方法区(运行时常量池)!(https://oscimg.oschina.net/oscnet/3528c94568da5147907
Stella981 Stella981
3年前
JVM内存模型和类加载机制
JVM内存模型Java代码是运行在Java虚拟机(JVM)上的,Java虚拟机通过解释执行(解释器)或编译执行(编译器)来完成。Java内存模型分为5个部分:方法区(MethodArea),Java堆(Heap),Java栈(VMStack),本地方法栈(NativeMethodStack),程序计数器(PC寄存器)!(ht
Stella981 Stella981
3年前
JVM内存区域划分
JVM内存区域划分一、JVM运行时数据区划分根据《Java虚拟机规范》JVM会把它管理的内存划分为若干个不同的数据区域,如下图所示:方法区、堆、栈(虚拟机栈、本地方法栈)、程序计数器。线程私有的意思是指,JVM每遇到一个新的线程就会为他们分配栈和程序计数器。!(https
Wesley13 Wesley13
3年前
JAVA中的栈和堆【转】
 原文链接 https://www.cnblogs.com/ibelieve618/p/6380328.htmlJAVA在程序运行时,在内存中划分5片空间进行数据的存储。分别是:1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆。基本,栈stack和堆heap这两个概念很重要,不了解清楚,后面就不用学了。以下是这几天栈和堆的学习记录和心得。得
Wesley13 Wesley13
3年前
JAVA 基本类型与 引用类型区别
 栈与堆都是Java用来在Ram中存放数据的地方。与C不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。       Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的
Wesley13 Wesley13
3年前
C++内存管理
C内存管理一、内存分配方式在C中,内存分成5个区,分别是堆、栈、自由存储区、全局/静态区和常量存储区。栈:存放函数参数以及局部变量,在出作用域时,将自动被释放.栈内存分配运算内置于处理器的指令集中,效率
Stella981 Stella981
3年前
JVM 面试
1、内存模型以及分区,需要详细到每个区放什么。通俗的说,Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。JVM主要管理两种类型内存:堆和非堆,堆内存(Heap Memory)是在Java虚拟机启动时创建,非堆内存(NonheapMemory)是在JVM堆之外的内存。简单来说,堆是Java代码可及的内
Stella981 Stella981
3年前
JVM中的Stack和Frame
JVM执行Java程序时需要装载各种数据,比如类型信息(Class)、类型实例(Instance)、常量数据(Constant)、本地变量等。不同的数据存放在不同的内存区中,这些数据内存区称作“运行时数据区(RuntimeDataArea)”。运行时数据区有这样几个重要区:JVMStack(简称Stack或者虚拟机栈、线程栈、栈等),Frame(又称S