Maine

纵有疾风起,人生不言弃

9. C语言基础-内存管理

9.1 作用域和生命周期

类型 作用域 生命周期
auto 变量 一对 {} 当前函数
static 局部变量 一对 {} 整个程序生命周期
extern 全局变量 整个程序 整个程序生命周期
Static 全局变量 当前文件 整个程序生命周期
extern 全局函数 整个程序 整个程序生命周期
static 函数 当前文件 整个程序生命周期
register 变量 一对{} 当前函数

9.2 内存分区

  1. Size 命令的使用:
$ size ./demo 
__TEXT  __DATA  __OBJC  others  dec hex
4096    4096    0   4294971392  4294979584  100003000
  1. Text(代码区)
  2. Data(静态区 初始化的全局变量,static 变量)
  3. bss(没有初始化的数据,全局变量,static 变量)
  4. Stack (栈区 普通局部变量,自动内存管理,先入后出)
  5. Heap (堆区 手动申请空间,手动释放,整个程序结束,系统会回收)

9.3 内存操作函数

  1. memset()

常用于数据清 0

#include <string.h>

int a[100] = {0};
// 一些操作,导致 a 不为0,现需要清 0 
memset(&a, 0, sizeof(a));
  1. memcpy()
#include <string.h>

int from[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int to[10];
// to, from , 原来所占内存大小,不是10哦
memcpy(to, from, sizeof(from)); 

// 最好不要出现内存重叠,如果出现内存重叠使用 memmove 
memcpy(&to[2], to, 5 * sizeof(to[0])); // 内存重叠
  1. memmove()

使用和 memcpy 一样

  1. memcmp() 内存比较

使用和strcmp() 差不多,按 ancii 码值比较

9.3 动态分配内存空间

  1. 申请
int *p;
// malloc 参数是分配空间的大小返回值是 void * 类型,需要类型转换
p = (int *)malloc(sizeof(int));

// 内存使用完需要释放
// free(p) 不是释放变量p,而是p指向的内存空间
// 内存被释放不是内存没有了,而是被操作系统回收了
// 同一块内存不能释放两次
// 操作释放过的内存等于操作野指针,段错误
free(p);
p = NULL; 
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注