BSS是英文Block Started by Symbol的简称,BSS段属于静态内存分配(包括静态变量和全局变量)。全局变量与静态变量均由系统分配和释放内存,若未对它们进行初始化操作,系统将自动将其值设置为0。

uninitialized data和initialized data统称为全局数据区

栈区往地址减小方向增长,堆区往地址增大方向增长。

text区又叫代码区(或代码段),这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

char *s = "HelloWorld";

指针s存放于栈区,"HelloWorld"存放于text区,不可修改
*s = ‘h’ 尝试修改字符串第一个字符,将会出现编译通过,运行报错的情况,因为text区一般是只读的,不可修改。

字符串常量和const修饰的变量的区别:
char a = ‘A’; // a存放在栈区
const char b = ‘B’; //b还是存放在栈区,const修饰的变量仅仅是告诉编译器b是一个常量,后续程序中若出现尝试修改b的操作时将会在编译时就报错。

举例分析:

#include <iostream>
int global_a = 1;
static int global_b = 2;
int global_c = 3;
int global_d;
int global_e;
int main()
{int a = 11;int b = 22;int c = 33;static int static_a = 4;static int static_b;static int static_c;printf("a的地址为:%p\n", &a);printf("b的地址为:%p\n", &b);printf("c的地址为:%p\n", &c);int arr[5] = { 1,2,3,4,5 };int len = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < len; i++){printf("&arr[%d]: %p\n", i, &arr[i]);}printf("global_a的地址为:%p\n", &global_a);printf("global_b的地址为:%p\n", &global_b);printf("global_c的地址为:%p\n", &global_c);printf("global_d的地址为:%p\n", &global_d);printf("global_e的地址为:%p\n", &global_e);printf("static_a的地址为:%p\n", &static_a);printf("static_b的地址为:%p\n", &static_b);printf("static_c的地址为:%p\n", &static_c);char s1[] = "HelloWorld";char* s2 = "HelloWorld";char* s3 = "HelloWorld";printf("s1:%p\n", s1);printf("s2:%p\n", s2);printf("s3:%p\n", s3);
}

结果:

内存划分:


结果分析:

  1. 因为栈是由地址高的向地址低的方向开辟空间,因此a、b、c三个变量的地址是依次减小的。而数组arr是先整体开辟空间,数组内部元素在数组整体所开辟的空间内自下而上(低地址->高地址)划分空间。

  2. char s1[] = “HelloWorld”; 这里是在栈上为s1申请了一段空间,其中的值赋成的"HelloWorld"
    char* s2 = “HelloWorld”;这里的"HelloWorld"存储在代码段,具体来说是代码段中的常量区

参考:
1.【C语言】内存分区
2.C语言内存分配

C/C++内存分区详解相关推荐

  1. linux磁盘分区什么意思,linux 磁盘分区详解

    <linux 磁盘分区详解>由会员分享,可在线阅读,更多相关<linux 磁盘分区详解(31页珍藏版)>请在人人文库网上搜索. 1.系统引导过程和硬盘分区结构讨论作者:章节来源 ...

  2. 磁盘及分区详解(MBR和GPT)、新增磁盘分区总体示例

    磁盘及分区详解(MBR和GPT) 1.磁盘为什么要分区? 2.Linux设备文件 3.磁盘简介 3.1 硬盘接口类型 3.2 机械硬盘和固态硬盘 3.2.1 磁盘术语 3.2.2 机械硬盘 4.分区方 ...

  3. Spark 内存管理详解(下):内存管理

    本文转自:Spark内存管理详解(下)--内存管理 本文最初由IBM developerWorks中国网站发表,其链接为Apache Spark内存管理详解 在这里,正文内容分为上下两篇来阐述,这是下 ...

  4. Android 动态分区详解(一) 5 张图让你搞懂动态分区原理

    文章目录 0. 导读 1. 动态分区详解的背景 1.1 背景 1.2 动态分区的本质 2. Linux device mapper 驱动 3. Android 动态分区布局 3.1 动态分区布局 3. ...

  5. Java内存溢出详解之Tomcat配置

    Java内存溢出详解 转自:http://elf8848.iteye.com/blog/378805 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError ...

  6. 【C++】C++对象模型:对象内存布局详解(C#实例)

    C++对象模型:对象内存布局详解 0.前言 C++对象的内存布局.虚表指针.虚基类指针解的探讨,参考. 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可 ...

  7. Java内存溢出详解

    Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 JVM在 ...

  8. MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)

    MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测) 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过 ...

  9. 《转载》Tomcat内存设置详解

    原文地址:Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 ...

最新文章

  1. MYSQL的字符序_mysql字符序核心概念
  2. 2019-1-15 课后作业
  3. vs2008 编译libtorrent
  4. Tomcat配置HTTPS
  5. 深圳车联网云服务商“麦谷科技”获5000万Pre A轮融资
  6. 关于陀螺仪 deviceorientation
  7. Structs2笔记①--structs的背景、structs2框架的意义、第一个helloworld
  8. 奇怪的加拿大:一方面大力禁烟,另一方面放松大麻
  9. 三.修改Jenkins插件下载路径
  10. 银河麒麟(kylin)V10桌面版
  11. iOS-高德地图点击地图获取点击点对应的地理位置,并添加自定义的大头针
  12. 达布中值定理(导数中间值定理)
  13. 计算机培训软文,软文诊断62期: 学写软文标题,只需懂电脑开机即可
  14. php 判断来源 微信客户端_使用PHP判断是否为微信、支付宝等移动设备访问代码...
  15. 在Unity3D中使用Mixamo动画资源
  16. 案例:用逻辑回归制作评分卡
  17. EduCoder-程序设计技术R(第四部分循环结构程序设计2)- 第5关:C循环-寻找完数
  18. 快客电路告诉你pcb布线105个黄金法则
  19. 8位寄存器置位与清零操作
  20. Web前端开发——CSS样式(Ⅰ)文本与文字样式

热门文章

  1. C语言程序设计--职工工资管理系统
  2. linux下sos使用教程,SOS SOS SOS SOS SOS SOS
  3. 专访微软邓力:语音识别与非监督深度学习、增强学习、词嵌入、类脑智能
  4. react+antd+dva细节
  5. 自己搭建的ftp无法下载文件
  6. 一个程序员的日常书单
  7. CSS:谷歌浏览器logo网页设计
  8. Android5.0 外部磁盘管理(代码摘自google)
  9. 计算机专业教语文,语文教学_嵌入_于计算机专业教学的研究与实践..doc
  10. Unity 配合Wallpaper Engine工具,实现电脑桌面壁纸游戏