Cfree5可以JAVA_C语言中free函数的使用详解

free函数是我们再写C语言程序时常用的函数,但是使用时需要注意,一不小心很肯能会引起吐核。

注意:free函数与malloc()函数配对使用,释放malloc函数申请的动态内存。对于free(p)这句语句,如果p 是NULL 指针,那么free 对p 无论操作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。

看一个程序

#include

#include

int main()

{

char * name = NULL;

free(name);

free(name);

free(name);

printf("no problem11111111\n");

name = (char *) malloc(10);

if(name)

{

printf("allocate successful\n");

}

else

{

printf("allocate failed\n");

}

free(name);

free(name);

printf("no problem2222222\n");

return 0;

}

运行结果:

d9c98a71229945cfaf013bc58ff683ed.png

这个程序正好验证了上面的注意事项。

为了避免出现这个错误,自己写了一个函数:

void myfree(void ** point)

{

if(*point != NULL)

{

free(*point);

*point = NULL;

}

}

这个函数将一级指针的地址作为菜蔬传入,这样就可以对一级指针进行操作。每次用free释放完空间,都将一级指针置为NULL,这样就避免了重复释放时程序崩溃。

将这个函数应用到刚才的程序中就是:

#include

#include

void myfree(void ** point)

{

if(*point != NULL)

{

free(*point);

*point = NULL;

}

}

int main()

{

char * name = NULL;

myfree((void**)&name);

myfree((void**)&name);

myfree((void**)&name);

printf("no problem11111111\n");

name = (char *) malloc(10);

if(name)

{

printf("allocate successful\n");

printf("地址为: %p\n",name);

}

else

{

printf("allocate failed\n");

}

myfree((void**)&name);

myfree((void**)&name);

printf("no problem2222222\n");

return 0;

}

451d36fa5640266508f527a197e54dcd.png

可以发现程序已经没有错误。

但是还有一个问题需要处理: 每次调用myfree函数的时候都需要取一级指针的地址而且需要强制类型转换成void** ,也就是每次都要写(void**)&point,这样很麻烦。

其实我们可以用带参数的宏定义来简化代码,宏定义如下:

#define FREE(p) myfree((void **)&p)

应用宏定义后的完整代码:

#include

#include

#define FREE(p) myfree((void **)&p)

void myfree(void ** point)

{

if(*point != NULL)

{

free(*point);

*point = NULL;

}

}

int main()

{

char * name = NULL;

FREE(name);

FREE(name);

FREE(name);

printf("no problem11111111\n");

name = (char *) malloc(10);

if(name)

{

printf("allocate successful\n");

printf("地址为: %p\n",name);

}

else

{

printf("allocate failed\n");

}

FREE(name);

FREE(name);

printf("no problem2222222\n");

return 0;

}

好了今天就写到这里了,希望对你有帮助,如有不正确的地方,还请指点。多谢~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值