变量存储地址
C语言变量存储类别和内存四区

C语言变量存储类别和内存四区C语言变量存储类别和内存四区C语言是一门通用计算机编程语言,应用广泛。
C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
下面我们一起来看看C语言变量存储类别和内存四区的介绍,欢迎大家阅读!C语言变量存储类别和内存四区变量存储类别变量声明/定义的一般形式:存储类别数据类型变量名存储类别指的是数据在内存中存储的方法。
存储方法分为静态存储和动态存储两大类。
标准C语言为变量、常量和函数定义了4种存储类型:extern、auto、static、register。
根据变量的存储类别,可以知道变量的作用域和存储期。
这4种存储类型可分为两种生存期限:永久的(在整个程序执行期都存在)和临时的(暂时保存在堆栈和寄存器中)。
extern和static用来标识永久生存期限的“变量和函数”,而anto和register用来标识临时生存期限的"变量"。
只有变量才有临时生存期限。
一个变量和函数只能具有一个存储类型,也只能有一种生存期限。
内存中供用户使用的空间有三部分:程序区:存放程序的可执行代码;静态存储区:存放静态变量(全局变量和静态局部变量);动态存储区:存放函数调用时调用函数的现场保护和返回地址、函数形参、自动局部变量;变量的声明分为”定义性声明“(需建立存储空间,如:int a;)和”引用性声明“(不需建立存储空间,如extern a;)。
广义上讲,声明包括定义,一般为叙述方便,把建立存储空间的声明称定义,而不不需建立存储空间的声明称声明。
auto函数中的局部变量,如果不用关键字static加以声明,编译系统对它们是动态地分配存储空间的。
函数的形参和在函数中定义的变量(包括在复合语句中定义的变量)都属此类。
在调用该函数时,系统给形参和函数中定义的变量分配存储空间,数据存储在动态存储区中。
在函数调用结束时就自动释放这些空间。
51单片机程序和变量存储位置

51单⽚机程序和变量存储位置
⼀、概念理清
使⽤环境: keil2,⽣成的代码⼤⼩如下,data保存于内部RAM中,xdata保存于外部扩展SRAM中,code保存于FLASH中。
51单⽚机涉及的存储介质:
RAM: 内部RAM,每种51单⽚机都应该有,共256字节。
⼤⼩固定
SRAM:内存,掉电消失,外部扩展RAM,⽐内部RAM稍慢,作⽤⼀样,⽤于定义变量。
⼤⼩要查单⽚机具体⼿册。
最⼤0xFFFF FLASH:(保存程序代码,只能按扇区更改)。
⼤⼩要查单⽚机具体⼿册。
EEPROM:(保存掉电保存的数据,flash中也可以保存掉电保存的数据,但EEPROM可以按字节寻址,⽐FLASH稍微灵活⼀点)。
⼤⼩要查单⽚机具体⼿册。
.
⼆、C51存储修饰关键字:data、 idata 、pdata 、xdata、 code
char i : 使⽤的RAM前128字节。
⽆修饰,等同与data char i,对应keil2编译后的data
idata char i : 使⽤的RAM前256字节。
即包含了data,对应keil2编译后的data
pdata char i :使⽤SRAM的前256字节,对应keil2编译后的 xdata
xdata char i:使⽤SRAM的所有字节。
即包含了pdata,对应keil2编译后的 xdata
code char i: 使⽤FLASH中的空间,不可更改,相当于存储常量。
,对应keil2编译后的flash
三、EEPROM不是⽤于变量定义,⽤来保存掉电数据。
作⽤和FLASH⼀样。
STM32内存分配解析及变量的存储位置

STM32内存分配解析及变量的存储位置原⽂内存映射在⼀些桌⾯程序中,整个内存映射是通过虚拟内存来进⾏管理的,使⽤⼀种称为内存管理单元(MMU)的硬件结构来将程序的内存映射到物理RAM。
在对于 RAM 紧缺的嵌⼊式系统中,是缺少 MMU 内存管理单元的。
因此在⼀些嵌⼊式系统中,⽐如常⽤的 STM32 来讲,内存映射被划分为闪存段(也被称为Flash,⽤于存储代码和只读数据)和RAM段,⽤于存储读写数据。
STM32 的 Flash 和 RAM 地址范围笔者标题所说的内存是指 STM32 的 Flash 和 RAM,下图是 ARM Cortex M3 的地址映射图:从图中我们可以看到 RAM 地址是从 0x2000 0000 开始的,Flash地址是从 0x0800 0000 开始的,笔者将在下⽂中着重对这两部分进⾏剖析。
Flash代码和数据是存放在 flash 中的,下⾯是将 flash 内部进⾏细分之后的⼀张图,图中标明了代码段,数据段以及常量在 flash 中的位置。
如上图所⽰,Flash ⼜可以细分为这么⼏个部分,分别是⽂本段 (Text),其中⽂本段中⼜包含可执⾏代码 (Executable Code)和常量 (Literal Value),在⽂本段之后就是只读数据区域 (Read Only Data),当然并不是所有架构的单⽚机都满⾜这样⼀个排布规律,这⾥只针对ARM Cortex M3 系列,只读数据段后⾯接着的就是数据复制段 (Copy of Data Section),第⼀次遇到这个概念的朋友看到数据复制可能会有所疑惑,其实这个段充当的作⽤是存放程序中初始化为⾮ 0 值的全局变量的初始值,之所以要将初始值存放到这⾥,是因为全局变量是存放在 RAM 上的,RAM 上的值掉电便丢失,每次上电后这些变量是要进⾏重新赋值的,⽽重新赋的值就存放在这⾥。
那为什么不存放初始化为 0 的全局变量初始值呢,原因也很简单,既然是初始化为 0,那么在上电后统⼀对存放初始化为 0 的全局变量的那块区域清0就好了。
c语言指针类面试题

c语言指针类面试题C语言指针是面试中常见的话题之一,下面我将从多个角度回答与C语言指针相关的面试题。
1. 什么是指针?指针是一个变量,用于存储内存地址。
它可以指向其他变量或数据,通过指针可以直接访问或修改这些数据。
2. 指针和变量的区别是什么?变量是一个具体的数据存储单元,而指针是存储变量地址的变量。
变量有自己的值,而指针存储的是另一个变量的地址。
3. 如何声明和定义指针?在C语言中,可以使用以下语法声明和定义指针:c.数据类型指针变量名;例如:c.int ptr;这声明了一个指向整型数据的指针变量ptr。
4. 如何使用指针访问变量的值?可以使用解引用运算符()来访问指针所指向的变量的值。
例如,如果有一个整型指针ptr,可以使用`ptr`来获取ptr所指向的整型变量的值。
5. 指针与数组的关系是什么?数组名本身就是一个指针,它存储了数组的首地址。
可以通过指针算术运算来访问数组中的元素,例如`(array + i)`可以访问数组中的第i个元素。
6. 什么是指针的运算?指针的运算包括指针的加法、减法、比较等操作。
指针加法可以用于在指针上进行偏移,指针减法可以计算两个指针之间的距离,指针比较可以判断两个指针是否相等或者大小关系。
7. 什么是空指针和野指针?空指针是指未指向任何有效地址的指针,可以用NULL来表示。
野指针是指指向未知或无效地址的指针,使用野指针可能导致程序崩溃或产生不可预测的结果。
8. 如何避免野指针?避免野指针的方法包括及时初始化指针、在指针使用完毕后将其置为NULL、避免对未分配内存的指针进行解引用操作等。
9. 什么是指针的指针?指针的指针是指一个指针变量存储了另一个指针变量的地址。
通过指针的指针可以实现对指针的间接访问和修改。
10. 什么是指针数组和数组指针?指针数组是指一个数组中的元素都是指针类型。
数组指针是指一个指针,它指向一个数组的首地址。
以上是对C语言指针类面试题的回答,希望能对你有所帮助。
java中变量的存储位置

java中变量的存储位置1.寄存器:最快的存储区, 由编译器根据需求进⾏分配,我们在程序中⽆法控制.2. 栈:存放基本类型的变量数据和对象的引⽤,但对象本⾝不存放在栈中,⽽是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。
)3. 堆:存放所有new出来的对象。
4. 静态域:存放静态成员(static定义的)5. 常量池:存放字符串常量和基本类型常量(public static final)。
6. ⾮RAM存储:硬盘等永久存储空间这⾥我们主要关⼼栈,堆和常量池,对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。
栈中的数据⼤⼩和⽣命周期是可以确定的,当没有引⽤指向数据时,这个数据就会消失。
堆中的对象的由垃圾回收器负责回收,因此⼤⼩和⽣命周期不需要确定,具有很⼤的灵活性。
对于字符串:其对象的引⽤都是存储在栈中的,如果是编译期已经创建好(直接⽤双引号定义的)的就存储在常量池中,如果是运⾏期(new出来的)才能确定的就存储在堆中。
对于equals相等的字符串,在常量池中永远只有⼀份,在堆中有多份。
如以下代码:String s1 = "china";String s2 = "china";String s3 = "china";String ss1 = new String("china");String ss2 = new String("china");String ss3 = new String("china");对于通过new产⽣⼀个字符串(假设为”china”)时,会先去常量池中查找是否已经有了”china”对象,如果没有则在常量池中创建⼀个此字符串对象,然后堆中再创建⼀个常量池中此”china”对象的拷贝对象。
这也就是有道⾯试题:String s = new String(“xyz”);产⽣⼏个对象?⼀个或两个,如果常量池中原来没有”xyz”,就是两个。
(整理)第04章 变量的存储类型

第4章变量的存储类型4.1 概述C语言中的变量具有两种属性:根据变量所持有数据的性质不同而分为各种数据类型;根据变量的存储方式不同而分为各种存储类型.变量的数据类型决定了该变量所占内存单元的大小及形式;变量的存储类型规定了该变量所在的存储区域,因而规定了该变量作用时间的长短,即寿命的长短,这种性质又称为"存在性".变量在程序中说明的位置决定了该变量的作用域,即在什么范围内可以引用该变量,"可引用"又称为"可见",所以这种性质又称为"可见性".计算机的内存和CPU中的寄存器都可以存放数据,变量究竟存放在何处则由存储类来决定.存储类型用来说明变量的作用域,生存期,可见性和存储方式.下面解释几个概念:1 作用域:是该变量在其上有定义的程序部分,通俗的说,即该变量起作用的某个程序区域。
2 变量的生存期:是指它从产生到消亡的存在时间,即变量从定义开始到它所占有的存储空间被系统收回为止的这段时间。
3 变量的可见性的含义:在某个程序区域,可以对变量进行访问(或称存取)操作,我们则称该变量在该区域为可见的,否则为不可见的。
再引入几个概念:4 全局变量和局部变量在一个函数内部或复合语句内部定义的变量叫内部变量,又称为"局部变量"。
在函数外定义的变量称为外部变量,又称为"全局变量"。
如:int x ;void main( ){int a, b;float c;……..}x 定义在函数外,是全局int 型变量a,b定义在main()函数内是局部int 型变量c 定义在main()函数内是局部float 型变量6 动态存储变量和静态存储变量。
在程序运行期间,所有的变量均需占有内存,有的是临时占用内存,有的是整个程序运行过程中从头到尾占用内存。
对于在程序运行期间根据需要进行临时性动态分配存储空间的变量称为"动态存储变量",对于在程序运行期间永久性占用内存的变量称为"静态存储变量".一个正在运行的程序可将其使用内存的情况分为如下三类(如下图):程序代码区: 程序的指令代码存放在程序代码区。
data,bdata,idata,pdata,xdata,code存储类型与存储区

data,bdata,idata,pdata,xdata,code存储类型与存储区data,bdata,idata,pdata,xdata,code存储类型与存储区bit是在内部数据存储空间中 20H .. 2FH 区域中⼀个位的地址,或者 8051 位可寻址 SFR 的⼀个位地址。
code是在 0000H .. 0FFFFH 之间的⼀个代码地址。
data是在 0 到 127 之间的⼀个数据存储器地址,或者在 128 .. 255 范围内的⼀个特殊功能寄存器(SFR)地址。
idata是 0 to 255 范围内的⼀个 idata 存储器地址。
xdata 是 0 to 65535 范围内的⼀个 xdata 存储器地址。
指针类型和存储区的关系详解⼀、存储类型与存储区关系data ---> 可寻址⽚内rambdata ---> 可位寻址的⽚内ramidata ---> 可寻址⽚内ram,允许访问全部内部rampdata ---> 分页寻址⽚外ram (MOVX @R0) (256 BYTE/页)xdata ---> 可寻址⽚外ram (64k 地址范围)code ---> 程序存储区 (64k 地址范围),对应MOVC @DPTR⼆、指针类型和存储区的关系对变量进⾏声明时可以指定变量的存储类型如:uchar data x和data uchar x相等价都是在内ram区分配⼀个字节的变量。
同样对于指针变量的声明,因涉及到指针变量本⾝的存储位置和指针所指向的存储区位置不同⽽进⾏相应的存储区类型关键字的使⽤如:uchar xdata * data pstr是指在内ram区分配⼀个指针变量("*"号后的data关键字的作⽤),⽽且这个指针本⾝指向xdata区("*"前xdata关键字的作⽤),可能初学C51时有点不好懂也不好记。
没关系,我们马上就可以看到对应“*”前后不同的关键字的使⽤在编译时出现什么情况。
你知道嵌入式C语言中各变量存储的位置吗?

你知道嵌入式C语言中各变量存储的位置吗?
在举行C/C++编程时,需要程序员对内存的了解比较精准。
常常需要操作的内存可分为以下几个类别:
1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局
部变量的值等。
其操作方式类似于数据结构中的栈。
2、堆区(heap)—普通由程序员分配释放,若程序员不释放,程序
结束时可能由OS回收。
注重它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放
在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
4、文字常量区—常量字符串就是放在这里的。
5、程序代码区—存放函数体的二进制代码。
以下是一段实际解释的程序代码:这是一个前辈写的,十分具体。
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456在常量区,p3在栈上。
static int c =0;全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456放在常量区,编译器可能会将它与p3
第1页共3页。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我相信大家都有过这样的经历,在面试过程中,考官通常会给你一道题目,然后问你某个变量存储在什么地方,在内存中是如何存储的等等一系列问题。
不仅仅是在面试中,学校里面的考试也会碰到同样的问题。
如果你还不知道答案,请接着往下看。
接下来,我们将在Linux操作系统上,以GCC编译器为例来讲解变量的存储。
在计算机系统中,目标文件通常有三种形式:
1.可重定位的目标文件:包含二进制代码和数据,与其他可重定位目标文件合并起来,创建一个可执行目标文件。
2.可执行的目标文件:包含二进制代码和数据,其形式可以被直接拷贝到存储器中并执行
3.共享目标文件:一种特殊的可重定位目标文件,即我们通常所说的动(静)态链接库
一个典型的可重定位目标文件如下图所示:
高地址
图1典型的ELF可重定位目标文件(数字代表索引)
夹在ELF头和节头部表之间的都是节(section),各个节的意思如下:
对于static类型的变量,gcc编译器在.data和.bss中为每个定义分配空间,并在.symtab节中创建一个有唯一名字的本地链接器符号。
对于malloc而来的变量存储在堆(heap)中,局部变量都存储在栈(stack)中。
下面我们以实际的例子来分析变量的存储:
根据以上题目和理论知识,我们可以推断出:
我们将从汇编代码和符号表中来分析以上答案是否正确。
我们首先来看该程序的汇编代码:
通过以上汇编代码可以发现,z和b在.data段,main和swap在.text段,a和c在.bss段,x,y,temp在stack中,printf 函数所打印的字符串在.rodata中。
下面我们在通过符号表来解释变量的存储。
每个可重定位目标文件都有一个符号表,它包含该文件所定义和引用的符号的信息。
在链接器的上下文中,有三种不同的符号:
1.由该文件定义并能被其他模块引用的全局符号。
即非静态的C函数和非静态的全局变量,如程序中的a,z,swap。
2.由其他模块定义并被该文件引用的全局符号。
用extern关键字所定义的变量和函数。
3.只被该文件定义和引用的本地符号。
用static关键字定义的函数和变量。
如程序中的b和c。
该程序所对应的符号表如图所示:
图2符号表
首先,我们解释上图中各字段的含义:
对于变量b和z,Ndx索引为3,我们观察图1,不难发现索引3对应的是.data段。
变量c对应的索引为4(.bss段),变量a对应的索引是COM,最终当该程序被链接时,它将做为一个.bss目标分配。
我们从反汇编代码中,对于变量a和c都是.comm (反汇编代码中以“.”开头的行,是指导汇编器和链接器运行的命令):
注意:a所对应的Bind为GLOBAL,即为全局变量,虽然变量c也在.bss段中,但Bind却是LOCAL,则为本地变量。
.data段中的变量b和c也是类似的情况。
swap和main都在索引1所对应的.text段中。
由于printf是在库中所定义的,所以索引为UND。
符号表中不包含对应于本地非静态程序变量中的任何符号。
这些符号是在栈中被管理的,所以符号表中没有出现x,y,temp符号。
相信大家读完这篇文章以后,再也用不着对类似的题目胆战心惊了。