为什么要用二级指针参数才能获得正确的结果

void main() 

     char *p=NULL; 
     myMalloc(p);    //这里的p实际还是NULL,p的值没有改变,为什么? 
     if(p) free(p); 



void myMalloc(char *s) //我想在函数中分配内存,再返回 

     s=(char *) malloc(100); 


myMalloc(p)的执行过程: 
分配一个临时变量char *s,s的值等于p,也就是NULL,但是s占用的是与p不同的内存空间。此后函数的执行与p一点关系都没有了!只是用p的值来初始化s。 
然后s=(char *) malloc(100),把s的值赋成malloc的地址,对p的值没有任何影响。p的值还是NULL。 
注意指针变量只是一个特殊的变量,实际上它存的是整数值,但是它是内存中的某个地址。通过它可以访问这个地址。 

程序2:void myMalloc(char **s) 

     *s=(char *) malloc(100); 


void main() 

     char *p=NULL; 
     myMalloc(&p);    //这里的p可以得到正确的值了 
     if(p) free(p); 

程序2是正确的,为什么呢?看一个执行过程就知道了: 
myMalloc(&p);将p的地址传入函数,假设存储p变量的地址是0x5555,则0x5555这个地址存的是指针变量p的值,也就是Ox5555指向p。 
调用的时候同样分配一个临时变量char **s,此时s 的值是&p的值也就是0x5555,但是s所占的空间是另外的空间,只不过它所指向的值是一个地址:Ox5555。 
*s=(char *) malloc(100);这一句话的意思是将s所指向的值,也就是0x5555这个位置上的变量的值赋为(char *) malloc(100),而0x5555这个位置上存的是恰好是指针变量p,这样p的值就变成了(char *) malloc(100)的值。即p的值是新分配的这块内存的起始地址。 

你可能感兴趣的:(C++)