内存:数据区 + 代码区 + 堆区 + 栈区
数据区:全局变量 静态变量 常量 (包括用const修饰的变量)
代码区:存储普通代码
栈区:局部变量,由系统分配
堆区:手动给变量或对象分配的空间(malloc,calloc,recalloc,new)
堆区(heap): 用于手动分配的空间,通常用malloc()/calloc()/realloc()/new()来实现动态分配内存,用free()/delete()来释放分配了的内存。
栈区(stack): 给局部变量分配空间,从函数的开始分配,在函数的结束之前释放。这个是由系统自动完成的。
数据区:全局变量(已初始化部分和未初始化部分)、静态局部变量(static类型的局部宾亮)。
⽂本区:代码段,存放⼆进制形式的指令(函数指令)。
在堆区上手动分配内存:
函数:void * malloc(字节) 是一个指针函数,申请成功,返回分配的内存的首地址,申请失败,返回NULL。默认是void *数据类型。所以如果要使用这个返回值的话要进行强制类型转换。
例: char *p = (char *)malloc(100);//开辟100字节的临时分配域,函数值为其第1个字节的地址。
void *calloc(unsigned n,unsigned siza) 其作用是在内存的动态存储中分配n个长度为size的连续空间,这个空间一般比较大,足以保存一个数组。
例:p=calloc(50,4)//开辟50*4个字节的临时分配域,把起始地址赋给指针变量p.
free(指针): free函数负责释放在堆上面分配的空间,free(p) 释放指针p所指向的那段内存。
free函数⽤于释放malloc申请到的空间,其参数必须是malloc的返回值。
注意:
1.free函数只能释放手动分配的内存,系统自动分配的内存不能由它释放。所以它里面的指针p,必须指向动态分配的内存
2.free(p) 之后p指向的空间被释放,但是p的值还是存在的,为了防止误操作,在释放空间之后,给指针置空,即p=NULL;
原则:谁开发谁保护,谁污染谁治理。
网友评论