`
waret
  • 浏览: 132326 次
  • 性别: Icon_minigender_1
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论

C/C++内存区划分

阅读更多

一 在C中分为这几个存储区
1.栈 由编译器自动分配释放;
2.堆 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收;
3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后释放;
4.另外还有一个专门放常量的地方。程序结束后释放。
                                                                                                                                             
    在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。比如:

int a = 0; //全局初始化区
char *p1; //全局未初始化区
void main()
{
     int b; //栈
     char s[] = "abc"; //栈
     char *p2; //栈
     char *p3 = "123456"; //123456{post.content}在常量区,p3在栈上
     static int c = 0; //全局(静态)初始化区
     p1 = (char *)malloc(10); //分配得来得10字节的区域在堆区
     p2 = (char *)malloc(20); //分配得来得20字节的区域在堆区
     strcpy(p1, "123456");
     //123456{post.content}放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块
}

二.在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区
1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
3.自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
4.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
5.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。

分享到:
评论

相关推荐

    C/C++中程序内存区域划分

    C/C++中程序内存区域划分示意图(初学)

    C/C++内存剖析

    划分以及当今流行的几种内存规模(扩充内存扩展内存等),以及相应的管理程序,实现方法,手段等有关技术问题,并 在此基础上深入剖析了计算机内存如何工作和应用程序如何使用内存,以及多个任务与内存等有关问题,...

    嵌入式系统的微模块化程序设计-实用状态图C/C++实现

    有关状态机设计方面的书籍,我这里隆重推荐一本:《Practical Statecharts in C/C++ Quantum Programming for Embedded Systems》,中文名叫做《嵌入式系统的微模块化程序设计-实用状态图C/C++实现》,北航出版的,...

    C和C++内存划分总结

    C和C++内存划分总结

    c_c++中内存区域划分大总结

    在c中分为这几个存储区 1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态...

    C/C++笔试题(附答案,华为面试题系列)

    答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变 量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调 用C 函数。C++提供了一个C 连接交换指定符号...

    浅谈C/C++中指针和数组的不同

    在C语言中由 malloc 申请的内存,或者在C++中,用 new 申请的内存,是在堆区中申请的。用完之后需要程序员自己回收,否则会造成内存泄漏。 3.全局区:存储全局变量及静态变量 4.常量区:存储常量。 5.代码区:存储...

    操作系统实验二报告【存储管理模拟(一)】

    操作系统,使用C语言/C++实现存储管理模拟(一),一、实验目的 编写和调试一个存储管理的模拟程序,加深对动态分区存储管理方式及实现过程的理解,了解动态分区分配方式中使用数据结构和分配算法。 二、实验要求 1...

    C/C++数据对齐详细解析

    Data Alignment 关于数据对齐问题,现在多多少少有了一些接触,简单地说下自己的看法。...内存空间是按照byte进行划分的,理论上对任何类型的变量的访问可以从任何地址开始,但实际上访问特定变量的时候经常在

    Effective C++

    1、从C转向C++ 条款1:尽量用CONST和INLINE而不用#DEFINE 条款2:尽量用而不用 条款3:尽量用NEW和DELETE而不用MALLOC和FREE 条款4:尽量使用C++风格的注释 2、内存管理 条款5:对应的NEW和DELETE要采用相同的形式 条款6:...

    软件加壳方案(原创C语言版)

    原创软件加壳方案,可C/C++实现,无需写汇编代码。 软件加壳方案 1 1. 方案概况 2 1.1. 方案概况图 2 1.2. 执行过程 2 2. 预备知识 3 2.1. 从EntryPoint到main() 3 2.2. 镜像基地址 3 2.3. 地址重定位 3 2.3.1. 全局...

    C语言实现 + 存储管理实验 + CPP源程序 + 实现页表的数据结构、分页式内存空间的分配及回收(建议采用位图法)页面置换算法

    用C语言模拟实现请求式分页管理。要求实现:页表的数据结构、分页式内存空间的分配及回收(建议采用位图法...提示:可先用动态申请的方式申请一大块空间,然后假设该空间为内存区域,对该空间进行页框的划分、分配等。

    CppNet:具有C ++ 11的跨平台网络库

    看在中文查看详细介绍CppNet是proactor模式和多线程网络,在tcp上具有C ++ 11。 简单:只导出一点接口,所有的ios界面都是异步回调,尽可能像调用系统的套接字API一样。 客户端只有一种附加的缓冲区对象类型。 快速...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

    C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数...

    keil如何查看程序占用的rom和ram大小

    keil如何查看程序占用的rom和ram大小,利用keil编译后,你就可以看到,文档中给了具体如何根据编译后的提示来计算程序所占用的空间,对于是否需要外扩RAM,具有重要意义

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

    C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数...

    c++如何控制对象的创建方式(禁止创建栈对象or堆对象)和创建的数量

    我们知道,C++将内存划分为三个逻辑区域:堆、栈和静态存储区。既然如此,我称位于它们之中的对象分别为堆对象,栈对象以及静态对象。通常情况下,对象创建在堆上还是在栈上,创建多少个,这都是没有限制的。但是...

Global site tag (gtag.js) - Google Analytics