getmemory()引发的指针(地址)传递分析

1. [case1] 常见(应该在在某个笔试面试中常见),自已写项目时,也会遇到使用或者实现这样的一个接口分配内存

1.1 error现象
//C风格

void get_memory(char *p,int len)

{

        p = (char *)malloc(len);

        return ;

}

int main()

{

        char *pstr = NULL;

        get_memory(pstr);

        strcpy(pstr,"hello world!");//在这里就会崩了

        printf("str =%s\n",pstr);

        return 0;

}
[分析说明]
以上程序会崩溃,没有输出;在哪里崩了,上面有说明,为什么会崩掉,为什么会这样,没有达到内存分配?【很多网上说得很笼统,怎么p在函数完了,就被释放了,这样说明显不是很清楚】
1. 地址传递的本质就是值传递,编译器的处理抽象本质是一致的。当pstr作为实参传递给getMemory()时,实质是把pstr的副本pstr1传递给getMemory(),由于pstr1指向的char 变量值是一样的,所以pstr1与pstr指针值是一样的即同一个地址(share_ptr?这里还有点小疑惑,指针变量的临时变量的副本,地址都是一样的吗?如果不一样,那既要重新生成新的地址新的变量,那这样的话动作也太大了,想想编译器也不会这样的),则getMemory()中对pstr1(pstr的副本)进行操作,根本就不会影响到pstr,当然pstr1是可以影响它们指向的变量值的。
[小结]
int val =100;
int *p =&val;
int **p1 =&p;
要理清,地址传递的本质,也是值传递,指针在函数中作形参时,指针p可以影响变量val即要想改变val,则传p,指针的指针即p1可影响p即要想改变p,则传p1; 

按照小结的结论,正确的写法:
void get_memory(char **p,int len){
        //用小结上的变量来说明:在上面的case1中我们想改变val,对*p操作即可,而不是操作p; 
       //那么在这里同理,我们想到val的指针p进行改变,我们直接改变*p1,而非p1
       //故如下:上面回答为什么不用 p = (char *)malloc(len);
      *p = (char *)malloc(len);
       return;
}
后面,没了...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值