动态内存分配
基本步骤:
- 用malloc类的函数分配内存;
- 用这些内存支持运用;
- 用free函数释放内存,防止内存泄漏;
//申请一个Int空间
int * pi=(int*)malloc(sizeof(int));
*pi=5; //使用空间
printf("*pi:%d",*pi);
free(pi);
内存泄漏
原因:
- 丢失地址
pi指针重复赋值,致使丢失前面的内存地址。
int * pi=(int*)malloc(sizeof(int)); //丢失
.......
int * pi=(int*)malloc(sizeof(int));
char* name=(char*)malloc(strlen("jack")+1);
strcpy(name,"jack");
while(*name!=0)
{
pritnf("%C",*name);
name++;
}
//最后name指向NUL字符,分配内存的起始地址丢失。
- 隐式内存泄漏
忘记用free释放不用的内存。
动态内存分配的函数
- malloc
- realloc
- calloc
- free
函数 | 描述 |
---|---|
malloc | 从堆分配内存 |
realloc | 在之前分配的内存块基础上,将内存重新分配 |
calloc | 从堆上分配内存并且清零 |
free | 将内存块返回堆 |
使用malloc函数
void * malloc(size_t);
malloc从堆上分配一块内存,字节数由其唯一参数决定,返回值为void指针(首字节地址),如果内存不足,就会返回NULL,此函数不会清空或者修改内存,新分配的内存里面可能包含垃圾数据。
注意:
初始化静态和全局变量时不能用malloc
static int *pi=malloc(sizeof(int)); (×)
static int *pi;
pi=malloc(sizeof(int)); (√)
使用calloc函数
calloc会在分配的同时清空内存。
void*calloc(size_t num,size_t size);
int * pi=calloc(5,sizeof(int));//(1)
int * pi=malloc(5*sizeof(int));//(2)
memset(pi,0,5*sizeof(int));
//calloc 函数会根据两个参数的乘积来分配空间
//(1)==(2)
使用realloc函数
void * realloc(void *ptr,size_t size);
//重新分配内存。
//ptr是指向原来内存块的指针.
//size是请求的大小
//返回值是重新分配的内存的指针
第一个参数 | 无 | 行为 |
---|---|---|
非空 | 0 | 原来的内存被释放了 |
非空 | 比原来的内存小 | 利用当前的块分配更小的块,多余的内存还给堆 |
非空 | 比原来内存大 | 要么在当前位置要么在堆的其它区域分配并把旧的内存复制到新的区域 |
使用free函数释放内存
void free(void*ptr);
ptr=NULL;
释放后,要将释放的指针赋值为NULL,解决迷途指针。
- 迷途指针
内存已经释放,而指针还在引用原始内存,这样的指针就称为迷途指针。