IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C/C++内存分区详解 -> 正文阅读

[C++知识库]C/C++内存分区详解

1
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++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 12:43:52  更:2022-03-06 12:47:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:44:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码