请教个小程序

昵称很不好取 2009-09-07 06:59:46
下面的程序中为什么会有内存泄露? 我的理解是C语言中函数传参是参数的一份拷贝,因此GetMemory函数得到的是指针p的拷贝,而p的拷贝不依然是系统分配给p的地址吗?因此malloc申请的空间正好对应到p里面,请问下我的理解错在哪里?
谢谢!
void GetMemory(char * p, int num)
{
p = (char *)malloc(num*sizeof(char));
}

int main()
{
char *str = NULL;
GetMemory(str,10);
strcpy(str,"hello");
free(str); //free 并没有起作用,内存泄漏,在GetMemory函数最后加return p 即可

return 0;
}
...全文
94 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
昵称很不好取 2009-09-07
  • 打赏
  • 举报
回复
明白了,十分感谢各位!!
jinwei1984 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 thefirstz 的回复:]
引用 9 楼 jinwei1984 的回复:
。。。
复制一分参数
它本身是什么就是什么阿
str是一个指针,值为null
p当然也是同样的指针,值为null

那str和p指向的地址是一样的是吧(如果不为NULL的话)?如果在函数里为p重新malloc的话,那么p就会指向一个新的地址,这样对吧?

不好意思,这里有点绕不出来了
[/Quote]

对的对的 自己看看麻
printf("%p", p);//打印指针的值(“内容”估计好点,免得又让你混淆)
昵称很不好取 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jinwei1984 的回复:]
。。。
复制一分参数
它本身是什么就是什么阿
str是一个指针,值为null
p当然也是同样的指针,值为null
[/Quote]
那str和p指向的地址是一样的是吧(如果不为NULL的话)?如果在函数里为p重新malloc的话,那么p就会指向一个新的地址,这样对吧?

不好意思,这里有点绕不出来了
sunjiakuang 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jinwei1984 的回复:]
因此GetMemory函数得到的是指针p的拷贝,而p的拷贝不依然是系统分配给p的地址吗?因此malloc申请的空间正好对应到p里面,请问下我的理解错在哪里?

没错阿 在函数里让p(拷贝的那分)指向了不同的地方,但是自己本身的指向并没改变 str还是null
[/Quote]
p的值与p的地址是两码事,要想改变p的值,必须传它的地址&p;
就像你想改变主函数中 int a 变量,你必须把a的地址传给子函数;
不要被p的值是个指针搞懵了。。。。。。
jinwei1984 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 thefirstz 的回复:]
我想知道的是复制到str里面的是p指向的值:NULL,还是p这个指针指向的地址?
[/Quote]

。。。
复制一分参数
它本身是什么就是什么阿
str是一个指针,值为null
p当然也是同样的指针,值为null

昵称很不好取 2009-09-07
  • 打赏
  • 举报
回复
我想知道的是复制到str里面的是p指向的值:NULL,还是p这个指针指向的地址?
jinwei1984 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 thefirstz 的回复:]
引用 3 楼 jinwei1984 的回复:
因此GetMemory函数得到的是指针p的拷贝,而p的拷贝不依然是系统分配给p的地址吗?因此malloc申请的空间正好对应到p里面,请问下我的理解错在哪里?
没错阿 在函数里让p(拷贝的那分)指向了不同的地方,但是自己本身的指向并没改变 str还是null

你的意思的拷贝后的指针地址与原来p已经不一样了是吧?
[/Quote]

可以这么说 函数传递参数的时候会复制一分参数在栈中(传值嘛)只是这两个参数指向同一个地方
所以传指针进去后, *p可以改变内容,因为指向同一个地方(你这里不能改变内容,都指向NULL)
但是你改变指针的指向,就和原来的参数没关系了
飞天御剑流 2009-09-07
  • 打赏
  • 举报
回复
面的程序中为什么会有内存泄露? 我的理解是C语言中函数传参是参数的一份拷贝,因此GetMemory函数得到的是指针p的拷贝,而p的拷贝不依然是系统分配给p的地址吗?因此malloc申请的空间正好对应到p里面,请问下我的理解错在哪里?
----------------------------------------------------------------------
GetMemory(str,10);只不过把str的值传给了p,但str不是p, p在GetMemory结束的时候就被抛弃了,原来分配的内存无法再释放,就成了内存泄漏了。

应该把GetMemory改为传str的地址或者返回p的值,例如:


void GetMemory(char ** p, int num)
{
*p = (char *)malloc(num*sizeof(char));
}

int main()
{
char *str = NULL;
GetMemory( &str,10 );
strcpy(str,"hello");
free(str); //现在free起作用了
return 0;
}
昵称很不好取 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jinwei1984 的回复:]
因此GetMemory函数得到的是指针p的拷贝,而p的拷贝不依然是系统分配给p的地址吗?因此malloc申请的空间正好对应到p里面,请问下我的理解错在哪里?
没错阿 在函数里让p(拷贝的那分)指向了不同的地方,但是自己本身的指向并没改变 str还是null
[/Quote]
你的意思的拷贝后的指针地址与原来p已经不一样了是吧?
kakashi0309 2009-09-07
  • 打赏
  • 举报
回复
strcpy() 执行就有问题了 str此时还是NULL
jinwei1984 2009-09-07
  • 打赏
  • 举报
回复
因此GetMemory函数得到的是指针p的拷贝,而p的拷贝不依然是系统分配给p的地址吗?因此malloc申请的空间正好对应到p里面,请问下我的理解错在哪里?

没错阿 在函数里让p(拷贝的那分)指向了不同的地方,但是自己本身的指向并没改变 str还是null
bitxinhai 2009-09-07
  • 打赏
  • 举报
回复
void GetMemory(char *& p, int num)
{
p = (char *)malloc(num*sizeof(char));
}
这样就没有泄露了,
使用GetMemory(char * p, int num),在传参的时候
要给p做一个备份,所以不会真正的把分配的空间地址带回
jinwei1984 2009-09-07
  • 打赏
  • 举报
回复
又是这种题。。。。。

GetMemory(str,10);

str没改变

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧