您好,登录后才能下订单哦!
这篇文章给大家介绍怎么在C语言中使用free函数,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
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; }
关于怎么在C语言中使用free函数就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。