6.1数据存放
bss段(未初始化的全局变量):4MB 存放没有初始化的 / 初始化为0 的全局变量
data段(初始化过的全局变量): 存初始化过的数据
radata段(常量数据):
text段(代码):放代码和部分常量
stack段(栈):放临时变量和函数参数
heap(堆):malloc :分配一块指定大小的内存
realloc :调整 / 重分配一块内存
free :释放不再使用的内存
6.2内存分配方式
1)从静态存储区分配:编译时就分配好了
2)在栈上分配 :内部局部变量,函数执行结束自动释放
3)在堆上分配 (动态内存分配):程序运行时用malloc / new 分配内存,手动用free / delete 释放
6.3野指针
成因:1)指针变量未初始化
2)指针被free、delete后未置NULL
6.4常见内存错位及对策
错误 | 预防 |
内存分配未成功 | assert |
分配成功,但未初始化就引用他 | 别忘赋初值 |
操作越过内存边界 | |
忘记释放内存,泄漏内存 | |
释放内存,却使用了它 |
|
(p!=NULL)/ if (p!=NULL)
6.5 段错误及调试方法
1)用gdb逐步查找段错误 gcc -g -rdynamic xxx.c ;gdb ./a.out
2)分析core文件 gdb ./a.out core
3)段错误时启动调试
4)利用backtrace和objdump 分析 objdump -d a.out
6.6指针与数组对比
数组:在 静态存储区/栈 被创建,数组名对应着一块内存。地址和容量在生命周期内不变,内容可变
指针:可随时指向任意类型的内存块,指针操作动态内存。比数组灵活,但也危险