1. 内存基础概念
1.1 内存分布图
static 局部变量不初始化放在BBS段,反之DATA段
BSS:Block Started by Symbol
中文:以符号起始的块
只读数据段一般放字符串常量
在stm32中:
- .text 代码段:程序代码、常量字符串 →存 Flash
- .rodata 只读常量:
const int a=10;→存 Flash - .data 已初始化全局 / 静态变量:
int g_var=100;- 原始数据:Flash
- 上电启动时,拷贝到 RAM运行
- .bss 未初始化全局 / 静态变量:
int g_var;→RAM,上电自动清零 - 栈 (stack):局部变量、函数入参、返回地址 →RAM
- 堆 (heap):
malloc动态申请内存 →RAM
1.2 堆空间
使用malloc和free来分配和释放
注意:不是100%能分配成功的
1.3 栈空间
栈空间实际上是函数内部局部变量分配的一些内存,函数结束就销毁
堆和栈的生长方向看箭头
1.3 内存越界
尽量不使用strcpy使用strncpy,减少内存越界,堆和栈中都可能出现内存越界
2. 指针
2.1 空指针和野指针
free后把指针变量置空,减少野指针
3. 注意
char *arr[3];
遵循先右后左原则,首先看变量名右边确定是数组,再看左边星号确定是指针