博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C进阶 - 内存四驱模型
阅读量:7113 次
发布时间:2019-06-28

本文共 1171 字,大约阅读时间需要 3 分钟。

一.内存四驱模型

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

转载地址:http://simhl.baihongyu.com/

你可能感兴趣的文章
PHP: 深入了解一致性哈希
查看>>
outlook 2003配置失败:到服务器的连接不可达
查看>>
SQLServer 常用监控性能DMV & DMF
查看>>
Thinkphp中eq,neq,gt,lt等表达式缩写
查看>>
解决tmux在非root下无法正常运行的问题
查看>>
校色、调色
查看>>
《javascript语言精粹》读书笔记(三)
查看>>
我的友情链接
查看>>
关于添加待入库文件列表内容
查看>>
我的友情链接
查看>>
THINKPHP_URL简化设置
查看>>
Ubuntu下添加Eclipse快捷方式
查看>>
gns3模式与使用csr1000v
查看>>
C++string与VC++CString互转
查看>>
PHP中的java方式重载
查看>>
osx分区合并命令行操作
查看>>
迈出第一步
查看>>
xargs paste
查看>>
hadoop在windows10 64位系统下的安装
查看>>
Hibernate空指针异常-(SettingsFactory.java:169)
查看>>