【 C/C++】变量在内存里的存储区域

C\C++各种变量存放区域(代码、数据、堆、栈) 声明为register的变量在由内存调入到CPU寄存器后,则常驻在CPU的寄存器中,因此访问register变量将在很大程度上提高效率,因为省去了变量由内存调入到寄存器过程中的好几个指令周期。:被声明为静态类型的变量,无论是全局的还是局部的,都存储在数据区中,其生命周期为整个程序,如果是静态局部变量,其作用域为一对{}内,如果是静态全局变量,其作用域为当前文件。如果全局变量未被初始化,那么将被存在BBS区中,且在编译时,自动将其值赋值为0,如果已经被初始化,那么就被存在数据区中。 阅读详情

C/C++语言在内存中一共分为如下几个区域,分别是:

  1. 内存栈区: 编译期间就能确定存储大小,运行时自动分配释放。存放函数的参数值、返回地址、局部变量的值等。在函数作用域内创建,在离开作用域后自动销毁。.esp 始终指向栈顶, 栈中的数据越多, esp的值越小。其操作方式类似于数据结构中的栈。
    存储空间是连续的,两个紧密挨着定义的局部变量,他们的存储空间也是紧挨着的。栈的大小是有限的,通常Visual C++编译器的默认栈的大小为1MB,所以不要定义int a[1000000]这样的超大数组。

  2. 内存堆区: 存放new或者malloc出来的对象,一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。动态分配得到的内存区域附带有分配信息, 所以你能够 free和delete它们。
    存储空间是不连续的,一般由malloc(或new)函数来分配内存块,并且需要用free(delete)函数释放内存。C/C++不提供垃圾回收机制,因此需要对堆中的数据进行及时销毁,如果程序员没有释放掉,那么就会出现常说的内存泄漏问题。需要注意的是,两个紧挨着定义的指针变量,所指向的malloc出来的两块内存并不一定的是紧挨着的,所以会产生内存碎片。另外需要注意的一点是,堆的大小几乎不受限制,理论上每个程序最大可达4GB。

  3. 静态区:全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(RW), 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(ZI)。程序结束后由系统释放
    和“栈”一样,通常是用于那些在编译期间就能确定存储大小的变量的存储区,但它用于的是在整个程序运行期间都可见的全局变量和静态变量。

  4. 常量区: 存放局部变量或者全局变量的值,常量字符串就是放在这里的。 程序结束后由系统释放 (RO)
    和“全局/静态存储区”一样,通常是用于那些在编译期间就能确定存储大小的常量的存储区,并且在程序运行期间,存储区内的常量是全局可见的。这是一块比较特殊的存储去,他们里面存放的是常量,不允许被修改。

  5. 代码区:存放函数体的二进制代码。 (RO)

栈、堆 对比
栈堆
存储内容局部变量变量
作用域函数作用域、语句块作用域函数作用域、语句块作用域
编译期间大小是否确定是否
大小1MB4GB
内存分配方式地址由高向低减少地址由低向高增加
内容是否可以修改是是
全局/静态存储区、常量存储区 对比
全局/静态存储区常量存储区
存储内容全局变量、静态变量常量
编译期间大小是否确定是是
内容是否可以修改是否

扒了一张图,这张图中所示内存空间,地址由下往上增长,分别标示了 .text、.data、.bss、stack和heap的内存分部情况。 我们可以看到:
在这里插入图片描述

text、data(gvar)、bss 在内存中地址较低低的位置(low level address),而堆栈则在相对较高的位置。
堆(Heap)往高地址方向生长,栈(Stack)往低地址方向生长。

知道如上一些内存分配机制,有助于我们理解指针的概念。

动&静

一个程序被加载到内存中,这块内存首先就存在两种属性:静态分配内存和动态分配内存。
静态分配内存:是在程序编译和链接时就确定好的内存。
动态分配内存:是在程序加载、调入、执行的时候分配/回收的内存。

Text & Data & Bss

  • .text: 也称为代码段(Code),用来存放程序执行代码,同时也可能会包含一些常量(如一些字符串常量等)。该段内存为静态分配,只读(某些架构可能允许修改)。
    这块内存是共享的,当有多个相同进程(Process)存在时,共用同一个text段。

  • .data: 也有的地方叫GVAR(global value),用来存放程序中已经初始化的非零全局变量。静态分配。
    data又可分为读写(RW)区域和只读(RO)区域。
    -> RO段保存常量所以也被称为.constdata
    -> RW段则是普通非常全局变量,静态变量就在其中

  • .bss: 存放程序中为初始化的和零值全局变量。静态分配,在程序开始时通常会被清零。

text和data段都在可执行文件中,由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。
这三段内存就组成了我们编写的程序的本体,但是一个程序运行起来,还需要更多的数据和数据间的交互,否则这个程序就是死的,无用的。所以我们还需要为更多的数据和数据交互提供一块内存——堆栈。

重点说下 堆(Heap)、栈(Stack):
1) 堆(Stack)向高内存地址生长,其大小由系统内存/虚拟内存上限决定,速度较慢,但自由性大,可用空间大。
2) 栈(Stack)向低内存地址生长,其最大大小由编译时确定,速度快,但自由性差,最大空间不大。
3) 堆和栈相向而生,堆和栈之间有个临界点,称为stkbrk。
4) 堆和栈都是动态分配内存,两者空间大小都是可变的。每个线程都会有自己的栈,但是堆空间是共用的。

Tips:

char* p = new char[20];
// 这行代码在Heap中开辟了20个char长度的空间,同时在Stack上压入了p,
// 指针变量p存在于栈上,其值为刚刚在堆上开辟的空间的首地址。

变量地址验证代码:

#include <stdio.h>
#include <malloc.h>
#include <string.h>

int a = 0; //全局初始化区,保存在数据段

char *p1; //全局未初始化区,保存在BSS段

void main() 
{
	int b; // 栈 
	
	char s[] = "abc"; 	//"abc"在常量区,s在栈上。并将常量区的"abc\0"复制到该数组中。这个数组可以随意修改而不会有任何隐患,
    					//而"abc"这个字符串依然会保留在静态区中。	
	char *p2; //栈 
	
	char *p3 = "123456"; 	/* p3保存在栈上,"123456\0"保存在data区的read-only部分
    						注意:如果令p3[1] = '9'; 则程序崩溃,指针可以访问但不允许改变常量区的内容
    						声明了一个指针p3并指向"123456\0"在静态区中的地址,事实上,p3应该声明为
    						char const *,以免可以通过p3[i]='n'这一类的语法去修改这个字符串的内容。如果这样
    						做了,在支持“常量区”的系统中可能会导致异常,在“合并相同字符串”的编译方法下会导致其它
    						地方的字符串常量古怪地发生变化。*/
	
	static int c =0;	//全局(静态)初始化区,保存在数据段
		
	p1 = (char *)malloc(10);  //分配得来得10和20字节的区域就在堆区。 
	
	p2 = (char *)malloc(20); //p2的地址在栈上,p2的值(也是一个地址)是堆上一块空间的地址	
	
	strcpy(p1, "123456"); //"123456"放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 
	
	printf("&a \t  &p1 \t    &b \t      &s \t&p2 \t  &p3 \t    &c \t      &(\"abc\") \t&(\"123456\")\r\n");
	printf("%p, %p, %p, %p, %p, %p, %p, %p, %p \r\n\r\n", &a, &p1, &b, &s, &p2, &p3, &c, &("abc"), &("123456"));

	printf("p1 \t  s \t    p2 \t      p3\r\n");
	printf("%p, %p, %p, %p \r\n\r\n", p1, s, p2, p3);	
} 

运行结果:
在这里插入图片描述
局部变量的压栈验证示例:

#include <stdio.h>

void Func(int a,int b)
{
	int c=111;
	int d=222;
	printf("Func(): %p , &a : %p , &b : %p , &c : %p , &d : %p\n",Func,&a,&b,&c,&d);
}
void main()
{
	int a = 123;
	int b = 456;
	printf("main(): %p , &a : %p , &b : %p\n",main,&a,&b);
	Func(a,b);
}

运行结果:

在这里插入图片描述

函数参数,从右至左压入栈;
局部变量,从上至下压入栈。

在这里插入图片描述
当然由于调用了printf函数,所以会有printf函数的栈,栈继续向上增长,即往低地址方向增长。进入栈的依次有函数参数,c中约定是从右至左的方式进栈,然后是返回信息,返回地址等,最后是函数内定义的局部变量。

在本文结束前,我也还是来介绍下自己吧。我从03年初学编程,一直到现在都在做软件开发方面的事,做过VC++、VB/Delphi/C++Builder、C#/Asp.Net、Java、Web前后端、数据库、服务器端、客户端、js、lua、Flash AS、cocos2dx/Unity3d……都有接触过,甚至做过很长一段时间的运营、产品策划、美工、客服、线下推广员、公司经理 多职务……技术只是一种工具,用来实现业务需求,所以最大的特长是逻辑思维、挖掘业务需求、强化用户体验、快速的产品实现,最自以为豪的,我做过的很多产品,很稳定,bug极少(当然也出现过没考虑周全的漏洞在所难免但总体上也还算少),有很多独立开发的游戏运营到现在还在稳定的运行。不是技术极客,而是业务需求带动技术的学习研究,所以也不怎么挑语言,编程语言大体上也都是相通的,底层原理也有很多类同的地方。所以缺点从不敢说精通哪一门语言。遇到小工具、小需求的订制实现,我个人最喜欢的还是用VC6,简洁干净,编译出来的东西 体积小,速度快,占CPU内存小。当然实际工作中,还是随项目。欢迎大家和我交流,我的QQ是:七6.肆-陆_柒-4`7_四.
生活中的我,热爱 街舞、飙车、花式游泳、游戏一条命通关……极限运动,我抖音号(一不小心玩出花样)是:1917940952

如果函数参数有引用传递(地址传递):

#include <stdio.h>

void Func(int &a,int b)
{
	int c=111;
	int d=222;
	printf("Func(): %p , &a : %p , &b : %p , &c : %p , &d : %p\n",Func,&a,&b,&c,&d);
}
void main()
{
	int a = 123;
	int b = 456;
	printf("main(): %p , &a : %p , &b : %p\n",main,&a,&b);
	Func(a,b);
}

运行结果:
在这里插入图片描述

====================================================

一条进程在内存中的映射

假设现在有一个程序,它的函数调用顺序如下:

main(…) ->; func_1(…) ->; func_2(…) ->; func_3(…),即:主函数main调用函数func_1; 函数func_1调用函数func_2; 函数func_2调用函数func_3。

当一个程序被操作系统调入内存运行, 其对应的进程在内存中的映射如下图所示:

在这里插入图片描述
注意:

  • 随着函数调用层数的增加,函数栈帧是一块块地向内存低地址方向延伸的;
  • 随着进程中函数调用层数的减少(即各函数调用的返回),栈帧会一块块地被遗弃而向内存的高址方向回缩;
  • 各函数的栈帧大小随着函数的性质的不同而不等, 由函数的局部变量的数目决定。
  • 未初始化数据区(BSS):用于存放程序的静态变量,这部分内存都是被初始化为零的;而初始化数据区用于存放可执行文件里的初始化数据。这两个区统称为数据区。
  • Text(代码区):是个只读区,存放了程序的代码。任何尝试对该区的写操作会导致段违法出错。代码区是被多个运行该可执行文件的进程所共享的。
  • 进程对内存的动态申请是发生在Heap(堆)里的。随着系统动态分配给进程的内存数量的增加,Heap(堆)有可能向高址或低址延伸, 这依赖于不同CPU的实现,但一般来说是向内存的高地址方向增长的。
  • 在未初始化数据区(BSS)或者Stack(栈区)的增长耗尽了系统分配给进程的自由内存的情况下,进程将会被阻塞, 重新被操作系统用更大的内存模块来调度运行。
  • 函数的栈帧:包含了函数的参数(至于被调用函数的参数是放在调用函数的栈帧还是被调用函数栈帧, 则依赖于不同系统的实现)。函数的栈帧中的局部变量以及恢复该函数的主调函数的栈帧(即前一个栈帧)所需要的数据, 包含了主调函数的下一条执行指令的地址。

函数的栈帧

函数调用时所建立的栈帧包含下面的信息:

1) 函数的返回地址。返回地址是存放在主调函数的栈帧还是被调用函数的栈帧里,取决于不同系统的实现;

2) 主调函数的栈帧信息, 即栈顶和栈底;

3) 为函数的局部变量分配的栈空间;

4) 为被调用函数的参数分配的空间取决于不同系统的实现。

注意:

  • BSS区(未初始化数据段):并不给该段的数据分配空间,仅仅是记录了数据所需空间的大小。
  • DATA(初始化的数据段):为数据分配空间,数据保存在目标文件中。

  1. 代码段(.txt)
      .txt段存放代码(如函数)与部分整数常量,.txt段的数据可以被执行

  2. 数据段(.data)
      .data用于存放初始化过的全局变量。若全局变量值为0,为了优化编译器会将它放在.bss段中

  3. bss段(.bss)
      .bss段被用来存放那些没有初始化或者初始化为0的全局变量。bss段只占运行时的内存空间而不占文件空间。在程序运行的整个周期内,.bss段的数据一直存在

.data和.bss段的区别可以通过下面程序验证:

char global_arr[1024 * 1024];    //存放在.bss段
void main()
{
}
char global_arr[1024 * 1024] = {4}; //存放在.data段,占文件空间
void main()
{
}

这两种代码,release编译后,文件大小分别是:36KB、1.03MB

  1. 常量数据段(.rodata)
      ro表read only,用于存放不可变修改的常量数据,一旦程序中对其修改将会出现段错误:
      (1) 程序中的常量不一定就放在rodata中,有的立即数和指令编码放在.text中
      (2) 对于字符串常量,若程序中存在重复的字符串,编译器会保证只存在一个
      (3) rodata是在多个进程间共享的
      (4) 有的嵌入式系统,rodata放在ROM(或者NOR FLASH)中,运行时直接读取无需加载至RAM( 哈佛和冯诺依曼,从STM32的const全局变量说起有所记录)
    想要将数据放在.rodata只需要加上const属性修饰即可。

  2. 栈
      栈是用于存放临时变量和函数调用的。栈也是一种先进后出的数据结构,函数的递归调用正得益于栈的存在。需注意存在栈的数据只在当前函数和子函数中有效,一旦函数返回数据将会被自动释放。

  3. 堆
      堆的使用周期有使用者控制,程序中的内存泄漏多因程序员对堆的管理不当引起,需谨慎。

  4. .comment段
      它存放的是编译器版本等信息。除了.comment,还有.note、.hash等其他段,了解即可。

C/C++程序内存中的变量存储区域 一、C语言变量存储区域 C语言在内存中一共分为如下几个区域,分别是: 内存栈区: 存放局部变量名; 内存堆区: 存放new或者malloc出来的对象; 常数区: 存放局部变量或者全局变量的值; 静态区: 用于存放全局变量或者静态变量; 代码区:二进制代码。 C/C++不提供垃圾回收机制,因此需要对堆中的数据进行及时销毁,防止内存泄漏,使用free和delete销毁new和malloc申请的堆内存,而栈内存是动态释放。 其地址如下: #include <stdio.h> #include &. 阅读详情

相关推荐

C/C++内存区域划分详解

C/C++内存管理详解 目录C/C++内存分布C语言中动态内存管理方式C++中动态内存管理 C/C++内存分布 C语言中动态内存管理方式 C++中动态内存管理

qq_49613557的博客 2183

c语言全局变量可以是数组吗_8000字!单片机C语言你必须知道的数据存储与程序编写知识!...

文章字数:8000 干货指数:⭐⭐⭐⭐⭐015大内存分区内存分成5个区,它们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。1、栈区(stack):FIFO就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。2、堆区(heap):就是那些由new分配的内存块,它们的释放编译器不去管,由我们的应用程序去控制,一般一个new就...

weixin_39743064的博客 569

你真的了解静态变量、常量的存储位置吗?

文章目录引言C++对内存的划分如何落实在Linux上自由存储区和堆之间的问题栈常量区静态存储区静态局部变量静态局部变量、静态全局变量、全局变量的异同 引言 在动态内存的博客中,我提到: 在Linux 内存管理的博客中,我提到: 尽管都有尽可能完全的描述,并且两者大致意思没有冲突。而之所以令我一直感到略有不同,越看越迷糊的原因是:第一张图讲的其实是C++在概念上对内存的划分,第二张图讲的是Linux对虚拟内存进行的划分。 前者是概念上的,也是C++程序在运行时会切实执行的,而后者就是在Linux系统上

Jormungand_V的博客 2693

Java静态变量存储在内存中的什么位置?

静态成员变量存储在堆的永久生成区域中。这是因为static不属于对象而是属于类,所以它被认为是类定义的一部分。如果静态变量是基元类型,它们将存储在permGen中。如果静态变量是一个引用变量,例如static Person obj=new Person(),那么reference变量obj将被存储在permGen中,新创建的objected将被放置在年轻一代中。 ...

zhangustb 1万+

别再死记硬背了!一张图搞懂无刷电机半桥与全桥驱动的核心差异(附避坑指南)

本文深入解析无刷直流电机的半桥与全桥驱动方式的核心差异,提供直观对比与选型指南。半桥驱动结构简单、成本低,适合低要求场景;全桥驱动性能优越但复杂,适用于高精度控制。文章还包含实战避坑指南,帮助工程师优化驱动方案选择与应用。

weixin_29290947的博客 320

SAP License:SAP会计凭证抬头的字段状态控制

FI模块的同事一般都知道在FI中有个字段状态变式,可以控制在凭证输入时哪些字段是必输、哪些可选哪些隐藏,但这只对凭证行项目中有效,你是否想过对于凭证抬头的字段是哪控制呢? 在中国,会计附件上都要带一个附件张数字段,但SAP的默认配置中没有这一字段,并非SAP没有设置此字段,而是我们没有配置这一字段。如果需要在凭证输入时放出分支号(BRNCH)、附件页数(NUMPG)等字段,在个人参数文件中加入参数CSF,参数值AR,即可。如下图: 实际上,这是对凭证国家的一个设置,在SAP中,配置了AR这个国家..

SAP权限管控|SAP用户权限管理|SAP权限合规检查|SAP全日志管理 2226

C/C++程序内存的各种变量存储区域和各个区域详解

C语言在内存中一共分为如下几个区域,分别是:1. 内存栈区: 存放局部变量名;2. 内存堆区: 存放new或者malloc出来的对象;3. 常数区: 存放局部变量或者全局变量的值;4. 静态区: 用于存放全局变量或者静态变量;5. 代码区:二进制代码。知道如上一些内存分配机制,有助于我们理解指针的概念。C/C++不提供垃圾回收机制,因此需要对堆中的数据进行及时销毁,防止内存泄漏,使用free和de...

jirryzhang的博客 8万+

使用python对创芯科技CANalyst-II分析仪进行二次开发(详细教程)

使用python对创芯科技CANalyst-II分析仪进行二次开发

ningqingzy的博客 1万+

【C/C++】内存四区,什么变量存储在什么区域

1

Lindsey's Blog 3807

DMA学习笔记

DMA(direct memory access,直接内存访问),是一种避开CPU,可以直接对外设和内存进行访问的技术,可以实现外设与内存、内存之间、外设之间的数据的访问和搬移。

weixin_46220498的博客 3114

Qualcomm 常用NV列表

^ NV ITEM ^ 功能^^ |NV10 |mode prefer,找网模式|新平台使用NV80000| ^NV74 NV74=0关闭自动接听电话^ |NV240 |NV240=FALSE|EVDO出现网络的问题,此项必须设定为FALSE| |NV255 |CDMA规避网络列表(SID/NID号)| |NV256 |

sdrgtywretyeruet的专栏 5771

C/C++程序内存中的变量存储区域及验证

C/C++程序内存中的变量存储区域及验证一、C语言变量存储区域二、C/C++程序内存的变量存储区域各个区域一条进程在内存中的映射生成的.o文件的段三、关键字volatile四、STM32 内存分配内存分配验证五、心得与参考总结体会参考 一、C语言变量存储区域 内存栈区: 存放局部变量名; 内存堆区: 存放new或者malloc出来的对象; 常数区: 存放局部变量或者全局变量的值; 静态区: 用于存放全局变量或者静态变量; 代码区:二进制代码。 C/C++不提供垃圾回收机制,因此需要对堆中的数据进行及时

weixin_51109735的博客 965

Android15车载系统开机冷启动流程源码解析

本文主要介绍Android15车机系统开机冷启动的流程,暂不包含bootloader,仅从kernel开始直至Launcher首页展示。

jidapenglin28的专栏 254

C/C++程序内存的各种变量存储区域及验证

文章目录一、重温C语言程序里全局变量、局部变量、堆、栈等概念,并在ubuntu系统中编程,输出信息进行验证二、重温C语言程序里全局变量、局部变量、堆、栈等概念,在Keil中针对stm32系统进行编程,调试变量,进行验证; 通过串口输出信息到上位机,进行验证。三、stm32的堆、栈、全局变量的分配地址,与ARM教材中的地址分配进行对比 一、重温C语言程序里全局变量、局部变量、堆、栈等概念,并在ubuntu系统中编程,输出信息进行验证 二、重温C语言程序里全局变量、局部变量、堆、栈等概念,在Keil中针对stm

Scorpio_L_的博客 1108

UG\NX二次开发 分割曲线

分割曲线没有ufun函数?那就换一种思路实现。

王牌飞行员_里海的博客 1147

如何在飞腾平台上安装Ubuntu操作系统

注意: 若主板上配置的是NVME硬盘,在进行内核配置时,需要将内核的NEME驱动勾选上,否则移植内核时,无法找到文件系统,进不去操作系统。可以通过rufus软件将镜像做到U盘中,本次使用版本为Rufus 3.9.124 ,其他版本也可以。不要下载live版本的,没有准备网络环境,是一个头疼的事情,笔者暂时没有实现网络安装。将U盘接到主板usb口上,接上串口,显示器,,必需串口有打印才可以安装。可以通过dd命令,将iso安装到U盘。安装的是最小系统,缺少很多命令,需要联网更新,或则更换飞腾专用内核。

技术联盟 2645

C/C++程序中全局变量、局部变量、堆、栈的存储区域介绍

区域作用内存栈区存放局部变量名内存堆区存放new或者malloc出来的对象常数区存放局部变量或者全局变量的值静态区用于存放全局变量或者静态变量代码区二进制代码。

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 2727

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C/C++中内存分为哪些区域?分别存储什么内容?

【代码】C/C++中内存分为哪些区域?分别存储什么内容?

2301_78999095的博客 912

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C语言—内存的五大区域/C、C++在内存中的存储方式

C/C++程序在内存中的存储方式在之前的学习中,我们已经了解了内存的基本定义:内存(Memory),是计算机的一种存储设备,其主要作用是进行程序的运行和一些中间数据的存储。在C/C++程序的运行过程中,不同类型的数据存储在内存的不同区域中,由此,引出今天的学习内容:内存的五大区域内存分为五大区域,分别存储不同类别的数据。五大区域分别为:栈区Stack,堆区Heap,BSS区,数据区(常量区)Dat...

Hello_Sue的博客 2826

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C/C++程序存储区

C/C++编译的程序占用的内存分为以下几个部分: .stack .heap .data. .bss .text 栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈 堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 全局区(...

weixin_44280688的博客 1840

C++变量存储位置

转自:1.https://blog.youkuaiyun.com/songzige/article/details/51329512 2.https://zhuanlan.zhihu.com/p/40536998 C语言在内存中一共分为如下几个区域,他们分别是: 1 内存栈区: 存放局部变量名; 2 内存堆区: 存放new或者malloc出来的对象; 3 常数区:存放局部变量或...

martinkeith的博客 5023

C/C++程序内存的各种变量存储区域和各个区域详解。栈帧,局部变量不调用函数,不分配存储地址,但是编译的时候已经确定局部变量的大小。局部变量不分配地址和编译时候确定空间大小不冲突

C语言在内存中一共分为如下几个区域,分别是: 1. 内存栈区: 存放局部变量名; 2. 内存堆区: 存放new或者malloc出来的对象; 3. 常数区: 存放局部变量或者全局变量的值; 4. 静态区: 用于存放全局变量或者静态变量; 5. 代码区:二进制代码。 知道如上一些内存分配机制,有助于我们理解指针的概念。 C/C++不提供垃圾回收机制,因此需要对堆中的数据进行及时销毁,防止内存泄漏,...

二进制模----细微行动改变影响世界 1545

C/C++存储区域划分(栈区,堆区,全局区,代码区)

常见的C/C++语言两大版本内存区域分区: 1.五大内存分区:堆、栈、全局/静态存储区、自由存储区和常量存储区。 2. 五大内存分区:堆、栈、全局/静态存储区、字符串常量区和代码区。 因为具体的内存分区与编译器有关,没有太大区别,我们粗略的将程序所占用的内存分为四个区域—栈区,堆区,全局区,代码区. 每个程序都有唯一的四个内存区域.我们需要熟悉和了解各个区域的特性,例如存储什么类型的数据, 有谁去申请开辟, 又有谁去管理释放等等。 一. 内存分配介绍 1.栈区(satck) 由编译器自动分配释放, 存放函数

weixin_44501390的博客 3880
上一篇: 【VC++】虚函数 内存结构 - 第三篇(篇外篇)(类有无实体对象,对虚函数表的影响研究)
下一篇: 【VC++】虚函数 内存结构 - 第四篇(多重继承,无虚函数覆盖)
maoyeahcom
博客等级 码龄15年 14粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值