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

标签: c++
848人阅读 评论(0) 收藏 举报
分类:
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的值是新分配的这块内存的起始地址。 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1067909次
    • 积分:14060
    • 等级:
    • 排名:第875名
    • 原创:326篇
    • 转载:108篇
    • 译文:6篇
    • 评论:251条
    我的Github
    @ThisisGame
    博客专栏
    最新评论