C进阶 - 内存四驱模型

一.内存四驱模型

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

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

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

二.模型案例详解

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

1char* getStr(){ 2 char buff[128]; 3 4 strcpy(buff,"12345"); 5 6 return buff; 7} 8 9void main(){ 10 char* str = getStr(); 11 12 printf("%s",str); 13 14 getchar(); 15}

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

1// 求数组的大小 2int size(int arr[]){ 3 int size = sizeof(arr) / sizeof(int); 4 return size; 5} 6 7void main(){ 8 int arr[] = {1,2,3,4,5,6}; 9 10 // 求数组的大小 11 int size = sizeof(arr) / sizeof(int); 12 13 printf("size = %d\n",size); 14 15 size = size(arr); 16 17 printf("size = %d\n",size); 18 19 getchar(); 20}

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

1char* getStr1(){ 2 char* str = "12345"; 3 return str; 4} 5 6char* getStr2(){ 7 char* str = "12345"; 8 return str; 9} 10 11void main(){ 12 13 char* str1 = getStr1(); 14 15 char* str2 = getStr2(); 16 17 printf("%d , %d",str1,str2); 18 19 getchar(); 20}

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

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

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

点赞
收藏

评论区

加载中...

相关推荐

java运行时数据区

运行时数据区包括以下几个部分:程序计数器,堆,java栈,本地方法栈,方法区1.程序计数器:当CPU需要执行指令时,需要从程序计数器中获取当前需要执行的指令所在存储单元的地址。用来指示执行哪条指令。其大小不会随程序的执行而发生改变。2.Java栈:java方法执行的内存模型。存放的时一个个栈帧,每个栈帧对应一个被调用的方法。  栈帧中包括:局

java的对象模型

java中的对象在内存中,究竟是怎样一种存在?这篇随笔,我们就来一探究竟。可能不够深入,但是我们把理解到位,深入到我们需要的程度这样即可。先来看下jvm的内存模型:程序计数器虚拟机栈和本地方法栈堆方法区(运行时常量池)!(https://oscimg.oschina.net/oscnet/3528c94568da5147907

Jvm的内存布局和垃圾回收机制

内存布局运行时数据区1.程序计数器:用来控制代码运行行数。2.Java虚拟机栈:每个线程运行方法(A调用B)时,先把A方法放入到栈底,然后加载B方法,B

JVM内存模型和类加载机制

JVM内存模型Java代码是运行在Java虚拟机(JVM)上的,Java虚拟机通过解释执行(解释器)或编译执行(编译器)来完成。Java内存模型分为5个部分:方法区(MethodArea),Java堆(Heap),Java栈(VMStack),本地方法栈(NativeMethodStack),程序计数器(PC寄存器)!(ht

JVM内存区域划分

JVM内存区域划分一、JVM运行时数据区划分根据《Java虚拟机规范》JVM会把它管理的内存划分为若干个不同的数据区域,如下图所示:方法区、堆、栈(虚拟机栈、本地方法栈)、程序计数器。线程私有的意思是指,JVM每遇到一个新的线程就会为他们分配栈和程序计数器。!(https

JAVA中的栈和堆【转】

 原文链接 https://www.cnblogs.com/ibelieve618/p/6380328.htmlJAVA在程序运行时,在内存中划分5片空间进行数据的存储。分别是:1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆。基本,栈stack和堆heap这两个概念很重要,不了解清楚,后面就不用学了。以下是这几天栈和堆的学习记录和心得。得