黑马程序员技术交流社区
标题:
c语言学习心得——内存管理
[打印本页]
作者:
vyqrvwgf
时间:
2015-11-2 17:45
标题:
c语言学习心得——内存管理
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成为一个野指针。
作者:
b31b33b34
时间:
2015-11-2 17:46
66666666666666666666666666666666666666666666666611
作者:
b31b33b34
时间:
2015-11-2 18:11
非常厉害,,,受到了很多启发
作者:
任子杰
时间:
2015-11-2 19:43
写的不错
作者:
lixp
时间:
2015-11-2 19:46
不错,学习了
作者:
p495416980
时间:
2015-11-2 21:04
不错 很仔细
作者:
jy00889669
时间:
2015-11-2 21:18
厉害厉害
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2