时间:2021-05-20
free函数是我们再写C语言程序时常用的函数,但是使用时需要注意,一不小心很肯能会引起吐核。
注意:free函数与malloc()函数配对使用,释放malloc函数申请的动态内存。对于free(p)这句语句,如果p 是NULL 指针,那么free 对p 无论操作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。
看一个程序
#include <stdio.h>#include <stdlib.h>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;}运行结果:
这个程序正好验证了上面的注意事项。
为了避免出现这个错误,自己写了一个函数:
void myfree(void ** point){ if(*point != NULL) { free(*point); *point = NULL; }}这个函数将一级指针的地址作为菜蔬传入,这样就可以对一级指针进行操作。每次用free释放完空间,都将一级指针置为NULL,这样就避免了重复释放时程序崩溃。
将这个函数应用到刚才的程序中就是:
#include <stdio.h>#include <stdlib.h>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;}可以发现程序已经没有错误。
但是还有一个问题需要处理: 每次调用myfree函数的时候都需要取一级指针的地址而且需要强制类型转换成void** ,也就是每次都要写(void**)&point,这样很麻烦。
其实我们可以用带参数的宏定义来简化代码,宏定义如下:
#define FREE(p) myfree((void **)&p)应用宏定义后的完整代码:
#include <stdio.h>#include <stdlib.h>#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;}好了今天就写到这里了,希望对你有帮助,如有不正确的地方,还请指点。多谢~~
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C语言中memcpy函数的用法详解memcpy(内存拷贝函数)c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n
C语言中调用Swift函数实例详解在Apple官方的《UsingSwiftwithCocoaandObjectgive-C》一书中详细地介绍了如何在Object
C语言中getch()函数详解及简单实例前言:这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,有的C语言命令行程序会用到此函数做游戏,
C语言中qsort函数的用法实例详解快速排序是一种用的最多的排序算法,在C语言的标准库中也有快速排序的函数,下面说一下详细用法。qsort函数包含在中qsort
C语言中值传递和指针传递实例详解在C语言中,函数的参数和返回值的传递方式有两种:值传递和指针传递。值传递和指针传递初学者总会有一种朦胧的感觉,所以建议把指针传递