malloc()的问题:
1.malloc分配新内存,通过参数带回所申请内存指针(需要二级指针或者用返回指返回)
错误程序: #include <stdio.h> #include <stdlib.h> void getmemory(char *p) { p=(char *) malloc(100); strcpy(p,"hello world"); } int main( ) { char *str=NULL; getmemory(str); printf("%s/n",str); free(str); return 0; }
运行结果: 程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险。
原因分析: //malloc(str)对指针str来说是传值操作,str在getmemory中被复制了一份,无法通过参数返回申请的内存地址,str仍为NULL,free(NULL)操作危险。 //getmemory函数中malloc()分配了新的内存给p,函数执行完之后p就找不到了,由于str并没有得到p的值,导致p指向的新分配的内存没有free,内存泄漏。
正确的处理方法: #include <stdio.h> #include <string.h> #include <stdlib.h> void getmemory(char **p) { *p=(char *) malloc(100); strcpy(*p,"hello world"); } int main( ) { char *str=NULL; getmemory(&str); printf("%s\n",str); free(str); return 0; } 或者:
#include <stdio.h> #include <string.h> #include <stdlib.h> char* getmemory(char *p) { p=(char *) malloc(100); strcpy(p,"hello world"); return p; } int main( ) { char *str=NULL; str=getmemory(str); printf("%s\n",str); free(str); return 0; }