小心指针的备份

小心指针的备份
某天一直在思考指针和双指针使用上的区别,以及各自应用地方。由指针的本质是修改内存块上的存放的值,即变量的值。类比联想到双指针应该也是修改指针变量的值,而指针变量存放的是地址,修改其值就相当于修改地址,即修改了指针的指向!修改了指向的内存块。
下面是一段代码我们慢慢来品尝。
#include<stdio.h>
void getMemory(char* p,int num)
{
p = (char*)malloc(sizeof(char)*num);
}
//下面是在主函数里面申请内存代码
int main(void)
{
char* str = NULL;
getMemory(str,100);//申请内存
strcpy(str,"hello");
return 0;
}
上面不仔细点,很多初学者会认为是理所当然的事情,但是最终在编译器上面运行的时候效果却不是我们想要期待的。问题就是出现在了指针的传递也是备份的!也就是说传递的str给getMemory()函数的时候这个时候的指针已不再是str了。而是他的备份了!因此str还是指向空,并没有指向咱门申请的那一块内存。这样的代码会出现内存泄露了!
正确的做法如下,改为双指针,双指针传参数才能改变一级指针的指向!
#include<stdio.h>
void getMemory(char** p,int num)
{
*p = (char*)malloc(sizeof(char)*num);
}
//下面是在主函数里面申请内存代码
int main(void)
{
char* str = NULL;
getMemory(str,100);//申请内存
strcpy(str,"hello");
return 0;
}

总结:一级指针改变的是变量的值,二级指针改变的是一级指针的值,也就是地址值,也就是指针的指向了!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值