C语言之动态内存管理
1、动态内存主要涉及的函数
void *malloc(size_t size);
void free(void *ptr);
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
2、原则
谁申请谁释放
3、内存错误案例
在这个案例中,出现了严重的地址泄漏。因为,P通过传参过去,函数里面的P已经和主函数的不是一个*P,所以导致。已经把动态创建的内存的首地址,丢失了。导致已经无法释放内存。
void func(int *p,int n)
{
*p = malloc(n);
if(p == NULL)
exit(1);
return ;
}
int main
{
int num = 100;
int *p = NULL;
func(p,num);
free(p);
return 0;
}
解决方法一:
使用二级指针,讲主函数的p真正的传参过去
void func(int **p,int n)
{
*p = malloc(n);
if(*p == NULL)
exit(1);
return ;
}
int main
{
int num = 100;
int *p = NULL;
func(&p,num);
free(p);
return 0;
}
解决方法二:
通过返回值,讲函数的p指针返回
int * func(int *p,int n)
{
*p = malloc(n);
if(*p == NULL)
exit(1);
return p;
}
int main
{
int num = 100;
int *p = NULL;
p = func(p,num);
free(p);
return 0;
}
4、野指针
在函数已经把p这个指针通过free进行了释放,但是你又给p进行了赋值操作。这个时候,编译器会随机给p发配了一个地址,这个地址已经不是之前的地址了。就会造成野指针现象。
void func(int *p,int n)
{
*p = malloc(n);
if(p == NULL)
exit(1);
return ;
}
int main
{
int num = 100;
int *p = NULL;
func(p,num);
free(p);
p = 123;//注意这一行
return 0;
}
解决方法:
在创建或者释放指针的时候,都多加上一句指针指向NULL,可以防止出现危险的野指针
void func(int *p,int n)
{
*p = malloc(n);
if(p == NULL)
exit(1);
return ;
}
int main
{
int num = 100;
int *p = NULL;
func(p,num);
free(p);
p = NULL;//将指针指向空
p = 123;//注意这一行
return 0;
}