CSDN上看到关于C++ 指针参数。。无语

在CSDN 上看到这么三个题,下面各种千奇百怪的回答真是参差不齐。。
只能用很无语来回答。


1。void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
2。char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}

3。Void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}

只能自言自语的说下了,尽管很基础。。。

第一个在GetMemory 方法体里面会产生一个临时的局部副本指针_p=(char *)malloc(100);_p=p, 这里 _p 申请了[color=red]堆空间[/color],只是改变了_p所指内容的地址(即_p),但是p是没有变化。
在GetMemory方法体结束后,_p 会在堆里面没有free,有可能内存泄露。。

第二个p是[color=red]栈内存[/color],是系统自动分配的,函数体后会制动销毁,返回的内容是未知地。。。

第三个同第一个MS是一样的。。 这时候依然_p=p, *_p分配空间,改变了*_p,*p有值了,即str有地址了,但是p其实是未知的,出来后*_p在堆里面没有free,有可能内存泄露

为了不让内存泄露

可以改造为==>


char *GetMemory2( int num)
{
char *p = (char *)malloc(num);
return p;
}
void Test(void)
{
char *str = GetMemory(str, 100);
strcpy(str, "hello");
printf(str);
free(str);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值