存储区划分
-----------------------------------------
对于任何一个内存其实都包括5个区域五个区:(内存地址从高到低依次为)
1、栈区
特点:由系统分配以及回收内存。 定义在函数体内分配的变量被分配在栈区
2、堆区(重点)
特点:由用户(开发人员或程序猿)申请分配和回收。 malloc
假如你一致开辟内存而不去回收,会导致系统内存越用越少,最终导致程序crash(崩溃)。
假如你一直没有回收,而且也没有崩溃,当你程序退出的时候,系统帮你回收
3、静态区(全局区)
特点:定义在函数体外的变量或者有static关键字修饰的变量
程序运行过程中一直存在,直到程序退出时候由程序回收
4、常量区
特点:用来存放常量的内存区域: 例如12,64,567 占用
5、代码区
特点:把原代码转化成0101的二进制序列存放在代码区 编程CPU指令存放在代码区,函数名也在
--------------------------------------------------------------
例1:int a = 8;
for (int i = 0; i < 9; i++) {
}
printf("i = %d\n",i);
出了函数作用域就会被回收
//static所修饰的变量特点:1、只初始化一次 2、只有程序退出才释放 3没初始化值,默认为0 4、该变量存在内 存的静态区
堆内存分配函数
malloc void *malloc(unsigned int size);
malloc是函数的名字, malloc函数向系统申请分配四则个连续的内存空间(以字节为单位)函数返回值是void * 是一个指针类型,但不代表确切的指针类型,程序员根据自己的需求转化为所需要的类型
int a = 8; //a分配的在栈内存
指针p里边存储的是10个字节的内存的首地址
malloc 堆内存分配函数特点: 分配指定大小的内存空间,但是不会把分配到的内存空间给清0
内存释放:free
void free(void *)free函数的作用是释放内存,内存释放是标记删除。标记删除不清除里边的内容。
例子:加入一部电影占了2G内存,正常理解删除的电影的话,是应该吧这部定影就清楚了,也就是说,对应 的内存空间里边的字节全部清除。但是这是一个非常庞大的工作量需要很长那个时间来完成。但实际生活中删除 一部电影几乎1秒就完成了,其实也就是标记删除,告诉系统这2G内存空间不用,谁想用分配给谁。
其他的分配函数:calloc(unsigned m, unsigned n)
跟malloc不一样的地方在于,通过calloc分配的内存空间上的所有字节都会被清0
realloc(<#void *#>p, unsigned newsize) 按新的长度重新赋值
其他内存操作函数
void *memset (void *s, int c ,size_t n)s是指针的首地址,从s指向的内存地址开始分配,分配n个字节大小的数据c
通常用于清除结构体或者数组中的数据
从source指向的位置开始拷贝,拷贝到的dest里边去,长度为n;
free(p3);
内存比较:
memcmp p1、p2是两个指针,比较p1和p2内存地址里边的值的ASCII值,结果可为<0 >0 =0
memcmp(const void *p1, <#const void *#>p2, sizeof(p1))
----------------------------------------------------------------------------------------------
堆内存专属函数:malloc calloc realloc内存操作函数,既可以用于堆内存,也可以用于栈函数 memcpy memcmp memset
----------------------------------------------------------------------------------------------