C学习记录7——内存管理
一、静态变量
1.静态(static)局部变量
- 作用域在定义函数内
- 生命周期同程序运行周期(在数据区存储)
- 值只能初始化一次,但可以赋值多次
- 若未赋初值,则系统自动赋值(数值型0,字符型空字符)
注意:不要返回局部变量的地址,因为运行后会释放,第一次可正确返回是因为编译器保留,第二次操作就会丢失
2.静态全局变量
作用域:只可在本文件中使用,不可在其他文件使用
3.静态函数
只可在本文件中使用,不可在其他文件使用的函数
二、内存布局
1.内存分区
运行前:
- 代码区text:程序执行二进制码(程序指令)由操作系统管理
特点:共享(目的:对频繁被执行的程序,只要在内存中有一份代码即可)
只读(原因:防止程序意外修改指令) - 数据区(全局区、静态区):程序结束后由系统释放
数据区包含 :
1)初始化数据区(data)
2)未初始化数据区(bss)
3)常量区
运行后:
- 栈区stack:系统为每一个程序分配一个临时空间,大小为1M,Windows中可扩展到10M,Linux中可扩展到16M。先进后出,执行完后自动释放。存储局部变量、函数信息、函数参数、数组、const局部常量
- 堆区heap:存储大数据、图片、音频等。需手动开辟(malloc/colloc、realloc)手动释放free
1)malloc()
void* malloc(size_t size);
在堆区中分配一块长度为size字节的连续区域,分配的内存空间内容不确定,一般用memset初始化,返回分配空间的起始地址。
int* p = (int*)malloc(sizeof(int)*10);
2)free()
free(p);
p为指针变量,释放其所指的空间。改变指针方向释放会出错。堆空间不可多次释放,空指针可以
2.内存操作函数
使用需#include <string.h>
1)memset()
重置内存空间的值
memset(s,c,n);
将s的内存区域的前n个字节以参数c填入(一般用于重制为0)
2)memcpy()
memcpy(dest,src,size_t n);
拷贝src所指内存内容的前n字节到dest所指的内存上
(dest和src不可重叠,可能报错)
3)memmove()
功能用法同memcpy(),可处理dest与drc内存空间重叠,但执行效率比memcpy()低
4)memcmp()
memcmp(s1,s2,n);
比较s1,s2所指向内存区域的前n个字节