C语言内存管理02(01)

数据结构:数据在内存中的结构

1. 怎么找到 定位到对应内存区域

  • 通过变量名 int a = 10;
  • 通过指针(地址)
    地址本身是数字 CPU 对外部资源进行了编址
    内存按照B形式进行分割 每个B都有一个独立的地址
    eg : 0x100010 1B
    char int short long 基本数据类型
    - 大小的限制
    - 具有访问方式的数字
    地址编码: 32/64bit

eg’: char * p ;
sizeof§ = 4B/8B sizeof(p[0])= 1B

访问方式:
- 基本访问 语言 数据类型关键字 int * p;char * p
- 自定义访问
* 结构体(定义多个不同数据类型的集合) 类
struct 累加
union 共享
* 数组 (定义多个同类型的集合)
* 函数 (具有输入信息和反馈信息的代码的集合)
* 地址 (确定访问方式)
怎么看变量名:编译器完成映射表的过程
名字 访问方式
int a int 地址指向 的位置(4B

  int * p1;   int * p2 ;    int * p3;
  char * a1[4];
  char (* a2)[4];

  char * b1(int ,int );
  char ( * b2)(int ,int );

  char * c1[3]  [2];
  char  (* c2)[3]  [2];

  char ( * d1[5])(int ,int );

p1 * (4B/8B) ----- 按照int方式一个对象一个对象的去访问
a1 数组(4个)( * )-----按照char方式一个对象一个对象的去访问![[O{​{%(6HQFU)(O~OS%49{H@8.png|320]]

a2 * -----数组(4个)char a2[0]和a2[1]之间差了4个char![[]9D1IFPKW4@NK%{1[1KL{J1.png|300]]
a2指向了一个空间,在空间里面4个char4个char的访问
b1 函数(输入)(返回第一个地址)-----然后按照一个char一个char的去访问
b2 * ----函数
c1 三行两列的数组( * )------三行两列这个平面里面放的都是钥匙
c2 * ------这是一把钥匙 三行两列的去访问
d1 == 五把钥匙,每个钥匙里面存的是 一个函数

2.在哪里分配

内存 分段

32bit    0x0000_0000  ~ 0xFFFF_FFFF          范围占4G
    char * s1 = (char * )0x20008000;     //强转成地址
      s1[8] = 'a';
      ↓
    0x20008008  1B  'a'
    0x20008009  1B   x          //不知道
    0x2000800a  1B   x
    0x2000800b  1B   x
  int * s1 = (int * )0x20008000;
	 s1[8] = 64;
	 0x20008008  1B  64;
     0x20008009  1B   0
     0x2000800a  1B   0
     0x2000800b  1B   0

地址很小 很大 被OS保护 哪怕是读 都会发生segement fault 段错误

内存结构
段 属性
4G - 3G OS kernel 不可读不可写,一旦操作被操作系统终止

--向下--(从大到小)----------------------------------------------------
                    stack段		所有的函数局部变量都在这里  可读可写     存临时区域
		                                        每个子函数都拥有一个独立的栈空间
		                                        每个子函数的栈空间有大小限制,一旦超过这个限制,栈溢出
	                堆段			          C语言编译器不维护,由程序员自己来维护
	                                                  空间没有限制           可读可写
	                                                  通过malloc申请空间
					                                  通过free释放空间,释放了空间,该空间仍然可以访问
					                                  如果不释放,导致系统内存泄露  变慢
					数据段		                    不依赖于函数的调用而诞生
					                                    生命周期是从程序运行开始,到程序运行结束
					                                      全局变量、静态变量
                     只读数据段	                  双引号 常量数字
		              代码段		                       只读
		 ---------------------------------------------
		             操作系统保护区            不可读不可写
	0x0---------------------------------------------
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tian Meng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值