C程序中的各个变量的地址与编译后的二进制程序中变量的地址并没有一一按照顺序存储,原因是编译器对程序进行了一定的优化,调整了变量在栈中的存储顺序。
32bit:4个字节
64bit:8个字节
全局变量储存在数据段,先申明的地址小,后申明的地址大,调用的函数里的局部变量存放在栈中。
int整型占用4个字节,变量的内存地址只显示第一个字节。
编译后的程序,有可能不会将变量按照编写代码的顺序存入内存,因为gcc编译时会对代码进行优化,它会将同类型的变量在内存中放到一起。
每调用一个函数都会分配一个栈内存
先声明的函数地址小,后声明的函数地址大
而在栈中是相反的
在栈中 一个函数可以被多次调用
每次调用函数都是一个独立的栈
栈存储的为函数当前的运行状态
一个函数可被多次调用
同类变量归类储存
编译过程中计算机系统本身就会对我们的代码进行一些优化
所以编译后的存储数据可能与编译前不同
常量和全局变量都被存储在数据段,且地址是唯一的,和前面可变区后者的地址可以被占用不同,通过中间的空区加以调和。
连续编入的地址差值的大小,表明了编入前一项地址的信息所占1内存空间的大小(导致多少内存空间被占用,压缩地址冗余)
p 直接打印地址内包含的信息
p& 打印地址
操作系统对内存的管理
函数运行时候产生的变量地址占栈内存空间
64bit中指针类型需要占8个字节
32bit电脑指针类型占4个字节(一些书中所指)
C语言中int为4字节,所以地址的定义为(以int为例):以4个字节中的第一个字节作为地址
变量只是一个名称,来表示一个内存的地址的简称,(变量就是内存)
而指针则是将变量(对于我们)与地址本质的转化,
更利于理解。
堆栈段:
1. 为函数内部的局部变量提供存储空间。
2. 进行函数调用时,存储“过程活动记录”。
3. 用作暂时存储区。如计算一个很长的算术表达式时,可以将部分计算结果压入堆栈。
数据段(静态存储区):
包括BSS段(Block Started by Symbol)的数据段。BSS段存储未初始化或初始化为0的全局变量、静态变量,具体体现为一个占位符,并不给该段的数据分配空间,只是记录数据所需空间的大小。数据段存储经过初始化的全局和静态变量。
变量只是一个名称,来表示一个内存的地址的简称,(变量就是内存)
而指针则是将变量(对于我们)与地址本质的转化,
更利于理解。
形象比喻:内存是一个酒店,每个变量就是房间的门牌,通过指针对门牌来找到地址,从而取得里面的东西。
堆栈段:
1. 为函数内部的局部变量提供存储空间。
2. 进行函数调用时,存储“过程活动记录”。
3. 用作暂时存储区。如计算一个很长的算术表达式时,可以将部分计算结果压入堆栈。
数据段(静态存储区):
包括BSS段(Block Started by Symbol)的数据段。BSS段存储未初始化或初始化为0的全局变量、静态变量,具体体现为一个占位符,并不给该段的数据分配空间,只是记录数据所需空间的大小。数据段存储经过初始化的全局和静态变量。
变量只是一个名称,来表示一个内存的地址的简称,(变量就是内存)
而指针则是将变量(对于我们)与地址本质的转化,
更利于理解。
形象比喻:内存是一个酒店,每个变量就是房间的门牌,通过指针对门牌来找到地址,从而取得里面的东西。
堆栈段:
1. 为函数内部的局部变量提供存储空间。
2. 进行函数调用时,存储“过程活动记录”。
3. 用作暂时存储区。如计算一个很长的算术表达式时,可以将部分计算结果压入堆栈。
数据段(静态存储区):
包括BSS段(Block Started by Symbol)的数据段。BSS段存储未初始化或初始化为0的全局变量、静态变量,具体体现为一个占位符,并不给该段的数据分配空间,只是记录数据所需空间的大小。数据段存储经过初始化的全局和静态变量。
变量只是一个名称,来表示一个内存的地址的简称,(变量就是内存)
而指针则是将变量(对于我们)与地址本质的转化,
更利于理解。
形象比喻:内存是一个酒店,每个变量就是房间的门牌,通过指针对门牌来找到地址,从而取得里面的东西。
堆栈段:
1. 为函数内部的局部变量提供存储空间。
2. 进行函数调用时,存储“过程活动记录”。
3. 用作暂时存储区。如计算一个很长的算术表达式时,可以将部分计算结果压入堆栈。
数据段(静态存储区):
包括BSS段(Block Started by Symbol)的数据段。BSS段存储未初始化或初始化为0的全局变量、静态变量,具体体现为一个占位符,并不给该段的数据分配空间,只是记录数据所需空间的大小。数据段存储经过初始化的全局和静态变量。
变量只是一个名称,来表示一个内存的地址的简称,(变量就是内存)
而指针则是将变量(对于我们)与地址本质的转化,
更利于理解。
形象比喻:内存是一个酒店,每个变量就是房间的门牌,通过指针对门牌来找到地址,从而取得里面的东西。
堆栈段:
1. 为函数内部的局部变量提供存储空间。
2. 进行函数调用时,存储“过程活动记录”。
3. 用作暂时存储区。如计算一个很长的算术表达式时,可以将部分计算结果压入堆栈。
数据段(静态存储区):
包括BSS段(Block Started by Symbol)的数据段。BSS段存储未初始化或初始化为0的全局变量、静态变量,具体体现为一个占位符,并不给该段的数据分配空间,只是记录数据所需空间的大小。数据段存储经过初始化的全局和静态变量。
变量只是一个名称,来表示一个内存的地址的简称,(变量就是内存)
而指针则是将变量(对于我们)与地址本质的转化,
更利于理解。
形象比喻:内存是一个酒店,每个变量就是房间的门牌,通过指针对门牌来找到地址,从而取得里面的东西。
堆栈段:
1. 为函数内部的局部变量提供存储空间。
2. 进行函数调用时,存储“过程活动记录”。
3. 用作暂时存储区。如计算一个很长的算术表达式时,可以将部分计算结果压入堆栈。
数据段(静态存储区):
包括BSS段(Block Started by Symbol)的数据段。BSS段存储未初始化或初始化为0的全局变量、静态变量,具体体现为一个占位符,并不给该段的数据分配空间,只是记录数据所需空间的大小。数据段存储经过初始化的全局和静态变量。
64位计算机:指针占8位字节,变量占4位字节
数据段在代码段之上,所以可以在代码基础上改变数据,数据段的内存会把相同类型的数据存在一起,即整形变量存一起,整形指针存一起。32位计算机是隔四个字节存一个,即0x7fffffffddfc-0x7fffffffddff, 0x7fffffffde00-0x7fffffffde04。
1个字节8位
1个整型32位,4个字节
a的地址是4个字节的首地址
ddfc ddfd ddfe ddff
内存地址最大值0X7FFFFFFFFFFF
32位指针4个字节,64位指针8个字节
编译器优化会把同一类型的变量声明放到一起