博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++程序的存储空间布局
阅读量:5014 次
发布时间:2019-06-12

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

最近在看《C++primer》和《APUE》,没搞懂这个存储空间布局的问题。

1.书上说C是分为栈,堆,未初始化数据段(bss段),已初始化数据段(数据段),程序代码区(正文段)。还有在栈和堆之间还加了个内存映射段的。

2.网上有说C++分区布局是堆、栈、自由存储区、全局/静态存储区和常量存储区的。(其实这种分法少说了一个程序代码区,自由存储区应该属于堆,区别不过是用malloc还是new来进行分配)

3.还有说分为栈,堆,全局区,文字常量区,程序代码区的。

其实,这些分法只是区分的角度不同,没有对错。个人认为第三种分法比较合适。

5大分区布局

栈(stack): 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 

堆(heap): 用于动态分配内存,堆区的数据需要手动释放或程序退出是系统来释放。堆是从低地址向高地址增长,采用链式存储结构。

全局区(静态区): 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。

文字常量区: 常量字符串就是放在这里的。 程序结束后由系统释放。

程序代码区:  存放函数体的二进制代码。

文字常量区

文字常量区:用来存储字符串常量的区域。当你初始化赋值的时候,这些常量就先在文字常量区开辟一段空间,保存此常量,定义后是不能修改的。以后相同的常量就都在这里了。

 

我一直疑问char* s = "Hello word"这种属于常量字符串区,那为何不是在栈中或者在全局区呢??

去网上搜了搜,赶脚这篇写很不错,详情请戳

 

其实,字符串常量按保存区域的不同分为以下几种:

 一种是保存在栈区 , char name5[20] = "fengkewei";  或 char name1[] = "fengkewei";

一种保存在文字常量区, 即 char *name = "fengkewei";

一种保存在全局区(静态区);

一种保存在堆区,即用malloc, alloc, realloc  分配内存分配的区域,可有程序员自身分配和释放。

 

转载于:https://www.cnblogs.com/beatrice7/p/4126053.html

你可能感兴趣的文章
14款下载有用脚本的超酷网站
查看>>
LXC-Linux Containers介绍
查看>>
7.31实习培训日志-docker sql
查看>>
c#中使用servicestackredis操作redis
查看>>
ios app 真机crash报告分析
查看>>
CRC标准以及简记式
查看>>
SEO搜索引擎
查看>>
关于本地使用tomcat部署web应用,浏览器自动跳转为https的问题
查看>>
一、Text To Speech
查看>>
Java读取并下载网络文件
查看>>
github上构建自己的个人网站
查看>>
在word中粘贴的图片为什么显示不完整
查看>>
SQL Server 数据库的鼠标操作
查看>>
net软件工程师求职简历
查看>>
总线置顶[置顶] Linux bus总线
查看>>
nullnullHandling the Results 处理结果
查看>>
SQL SERVER BOOK
查看>>
JS基础回顾,小练习(判断数组,以及函数)
查看>>
多任务——进程
查看>>
WCF:如何将net.tcp协议寄宿到IIS
查看>>