C 内存分区模型

C 程序在执行时,将内存大方向划分为4个区域

  • 代码区:存放函数体的二进制代码,由操作系统进行管理

  • 全局区:存放全局变量和静态变量以及常量

  • 栈区:由编译器自行分配释放,存放函数的参数值,局部变量等

  • 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

内存四区意义:

不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程

1.1 程序运行前

在程序编译后,生成了.exe 可执行文件,此时程序分为两个区域

代码区:

存放CPU执行的机器指令

代码是共享的,共享的目的是对于频繁被执行的程序,只需在内存中有一份代码即可

代码区是只读的,原因是防止程序意外的修改了它的指令

全局区:

全局变量和静态变量存放在这里

全局区还包括了常量区,字符串常量和其他常量也存放在这里

该区域的数据在程序结束后由操作系统释放

总结:

  • C 中在程序运行前只分为 全局区和代码区

  • 代码区特点是 共享和只读

  • 全局区存放 全局变量、静态变量、常量

  • 常量区(全局区)存放 const修饰的全局常量 和 字符串常量

1.2 程序运行后

栈区:

由编译器自动分配释放,存放函数的参数值,局部变量等

注意:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放

堆区:

由程序员分配释放,若程序员不释放,程序结束时由操作系统系统回收

在C 中主要利用new在堆区开辟内存

示例:

#include<iostream>using namespace std;//了解栈区int* fun() {int a = 10;//局部变量存放在栈区,栈区的数据在函数执行完后自动释放return &a;}//了解堆区int* func(){int* b = new int(12);return b;}int main() {    //了解栈区int* p = fun();cout << *p << endl;//第一次可以打印正确的数字,是因为编译器做了保留cout << *p << endl;//第二次这个数据不再保留//了解堆区int* q = func();cout << *q << endl;cout << *q << endl;return 0;}

总结:

只有局部变量,局部常量存放在栈区(局部定义的量,除了静态~,其余的都在栈区)

1.3 new操作符

C 中利用new操作符在堆区开辟数据

堆区开辟的数据,由程序员手动开辟,手动释放(delete

利用 new 创建的数据,会返回该数据对应的类型的指针

示例:

//堆区开辟数组int main() {int* arr = new int[10];for (int i = 0; i < 10; i  ){arr[i] = i;}for (int i = 0; i < 10; i  ){cout << arr[i] << endl;}//释放数组 delete 后加 []delete[] arr;        //cout << arr[1] << endl; //报错,释放的空间不可访问system("pause");return 0;}

来源:https://www.icode9.com/content-3-820201.html

(0)

相关推荐

  • 全栈必备 :C语言基础

    [引子]温故而知新,"三日不弹,手生荆棘",代码也是如此.另一方面,自己挖的坑要自己填.在<全栈的技术栈设想>中埋下了4种编程语言的伏笔,已经兑现了Javacript, ...

  • 单片机的内存和寄存器是什么?代码中的变量和内存之间有什么关系?

    基础概念 单片机有寄存器和内存. 内存就是RAM.ROM/FLASH,这里的内存的概念和电脑的不太一样,不要搞混,眼着于单片机即可. ROM/FLASH:程序存储区(只读存储器),不变的东西都存这俩里 ...

  • C语言程序里全局变量、局部变量、堆、栈的存储区域

    文章目录 一.存储区域介绍 二.在ubuntu系统中输出信息进行验证 三.在Keil中针对stm32系统进行验证 四.总结 五.参考资料 一.存储区域介绍 C语言在内存中一共分为如下几个区域 区域 作 ...

  • C/C++ Memory Layout

    为什么需要知道C/C++的内存布局和在哪可以可以找到想要的数据?知道内存布局对调试程序非常有帮助,可以知道程序执行时,到底做了什么,有助于写出干净的代码.本文的主要内容如下: 源文件转换为可执行文件 ...

  • Java 内存模型

    本书部分摘自<Java 并发编程的艺术> 线程通信与同步 在并发编程中,有两个需要处理的关键问题: 线程之间如何通信 线程之间如何同步 通信指线程之间以何种机制来交换信息,通信机制有两种: ...

  • 王者荣耀史诗级更新,多款模型翻新,鲁班变丑,手机内存真不够了

    王者荣耀这次真的来了一次史上最大更新,一次更新版本居然高达1G数据,两次更新一次是270左右,一次是超过一千,所以说很多玩家担心的这次更新后没内存的可能真的要发生了,不过据说精简版的王者荣耀正在开发中 ...

  • 阐明毛囊干细胞的发生起源 - -提倡在筒状分区诱导干细胞的“伸缩镜模型”

    物理化学研究所 科学技术振兴机构 阐明毛囊干细胞的发生起源 - -提倡在筒状分区诱导干细胞的"伸缩镜模型" 理化学研究所(理研)生命机能科学研究中心细胞外环境研究小组的森田梨津子研 ...

  • 深度学习模型的训练时内存次线性优化

    深度学习模型越来越大,大公司给出的方案是分布式计算,比如Google的Mesh-Tensorflow和Gshard.但是成本对于个人开发者而言却不太友好.今天则给大家介绍一篇陈天奇大佬的工作,以计算换 ...

  • 内存模型--栈/stack

    表白:黑白圣堂血天使,天剑鬼刀阿修罗.  讲解对象:/内存模型--栈/stack 作者:融水公子 rsgz 汇编教程 汇编教程 http://www.rsgz.top/post/91.html 分给应 ...

  • 内存模型--堆/heap

    表白:黑白圣堂血天使,天剑鬼刀阿修罗.  讲解对象:/内存模型--堆/heap 作者:融水公子 rsgz 汇编教程 汇编教程 http://www.rsgz.top/post/91.html 汇编里面 ...

  • 内存模型和原子操作笔记

    内存模型和原子操作笔记

  • 训练大模型也不怕,轻量级TorchShard库减少GPU内存消耗,API与PyTorch相同

    第一时间获取价值内容 来自:机器之心 训练大模型时,如何优雅地减少 GPU 内存消耗?你不妨试试这个 TorchShard 库,兼具模型并行与数据并行等特点,还具有与 PyTorch 相同的 API ...

  • 深入理解C11/C 11内存模型

    现代计算机体系结构上,CPU执行指令的速度远远大于CPU访问内存的速度,于是引入Cache机制来加速内存访问速度.除了Cache以外,分支预测和指令预取也在很大程度上提升了CPU的执行速度.随着SMP ...