数据结构:数据在内存中的结构
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方式一个对象一个对象的去访问
a2 * -----数组(4个)char a2[0]和a2[1]之间差了4个char
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---------------------------------------------