1.c语言内存管理的内容
对计算机内存资源的分配和使用。高效快速地分配,并且在适当的时候释放和回收内存资源。
2.内存的分区
栈区 :是用户存放程序临时创建的局部变量。
堆区 :动态分配的内存段。
bss段:未初始化的全局变量和静态变量。
数据区:已经初始化的全局变量和静态变量,字符串常量。
代码区:程序执行代码的一块内存区域。
3.内存的分配
1)从静态区域分配
int a=10;
内存在编译的时候分配。
2)在栈上创建
函数内部局部变量的储存单元都可以在栈上创建。
3)从堆上分配(动态分配)
4.动态分配的函数(stdlib.h)
1)malloc
void *malloc(unsigned size);
在堆区分配一个连续的,大小为size字节的空间,如果分配成功,返回内存的首地址,如果分配失败,返回null
- #include<stdio.h>
- #include<stdlib.h>
- int main(int argc,const char *argv[]){
- //等号两边类型一致。
- int *p=(int*)malloc(4*sizeof(int));
- if(p!=NULL){
- //代码
- }else{
- printf("内存申请失败\n");
- }
- return 0;
- )
复制代码
//注意:1)malloc申请的内存空间如果不赋值,存放的是垃圾数。
2)使用一个函数对malloc函数申请空间初始化
memst(p,A,sizeof(int)*4);
表示把malloc函数申请的空间的内容全部初始化为A
2)calloc
calloc(快数,长度)
int *p=(int *)calloc(4,sizeof(int));
calloc可以自动初始化为0
3)relloc
relloc(p,40*sizeof(int));
给已经存在的空间扩展到指定大小
1)如果没有36个连续的p地址之后的内存空间,则在新位置扩展40个新空间,把旧内容拷贝过去。
2)如果有36个连续的p地址之后的内存空间,则直接扩展。
安全起见 :p=relloc(p,40*sizeof(int));重新指向。
5.内存泄露
- #include<stdio.h>
- #include<stdlib.h>
- int main(int argc,const char *argv[]){
- int *p=malloc(100);
- return 0;
- }
复制代码
当代码块结束时,存在栈区的局部变量p被释放,但是在堆区申请的100字节大小的内存空间一直存在,这样就会造成内存泄露。
解决方法释放p之前,先释放堆区中的内容,使用free函数。
- #include<stdio.h>
- #include<stdlib.h>
- int main(int argc,const char *argv[]){
- int *p=(int *)malloc(100);
- *(p+1)=100;
- free(p);
- p=NULL;
- return 0;
复制代码
//先释放空间,再让指针指向NULL,如果不指向NULL,p成为一个野指针。 |
|