1、先看一反例:
//目的:通过函数myMalloc改变指针p的值
#include<stdio.h>
#include<malloc.h>
void myMalloc(char *s) //我想在函数中分配内存,再返回 { s=(char *) malloc(100); } void main() { char *p=NULL; myMalloc(p); //这里的p实际还是NULL,p的值没有改变,为什么? if(p) free(p); }
以上例子中,p实际还是NULL,p的值没有改变,为什么?
答:我们的目的就是要指针p的值,因为p本身就是指针,传如myMalloc函数的实际上就是P的副本P1(副本改变,原来的P是不会改变),传入myMalloc函数的副本p1会改变了,p会改变吗?显然不会,跳出myMalloc函数后P1就被释放,P没有发生任何变化,所以P的值仍然是NULL。
2、请看下面这个可以改变P的值得程序:
//目的:通过函数myMalloc改变指针p的值
#include<malloc.h> #include<stdio.h> void myMalloc(char **s) //我想在函数中分配内存,再返回 { *s=(char *) malloc(100); printf("%x\n",*s); } void main() { char *p=NULL; myMalloc(&p); printf("%x\n",p); if(p) free(p); }
3、用(void**)就更具有一般性了,哈哈
//目的:通过函数myMalloc改变指针p的值 #include<malloc.h> #include<stdio.h> void myMalloc(void **s) //我想在函数中分配内存,再返回 { *s=(char *) malloc(100); printf("%x\n",*s); } void main() { char *p=NULL; myMalloc((void **)&p); //这里的p实际还是NULL,p的值没有改变,为什么? printf("%x\n",p); if(p) free(p); }