指针作为函数参数的问题

augustinlouis 2009-10-12 01:03:19
书上有一句话:“当函数参数为一个指针时,不能用该指针去动态分配内存,如果一定要的话,
要用指针的指针”
比如:1:(错误的方法)
void fun(int*q)
{
q=(int*)malloc(sizeof(int));
}
int main()
{
int * p;
fun(p);
return 0;
}
2:(正确的方法)
void fun(int**q)
{
*q=(int*)malloc(sizeof(int));
}
int main()
{
int *p;
fun(&p);
retur 0;
}
这是为什么呢?
...全文
127 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
augustinlouis 2009-10-12
  • 打赏
  • 举报
回复
刚才睡了一觉,醒时想通了,一句话,就是形参的改变不会改变实参,结账了,谢谢各位!
小魔菇 2009-10-12
  • 打赏
  • 举报
回复
改变不了指针的指针的指向的内存,可以改变它指向内存的内容。
奇才有点痴 2009-10-12
  • 打赏
  • 举报
回复
因为指针传递也是将值传递,就是将指针的值拷贝一份给函数的形参,这样当函数运行完之后,形参在栈上的空间释放,而你传递进去的指针(1中的p指针)的值并没有指向函数中分配的内存,即并没有被改变。
hittlle 2009-10-12
  • 打赏
  • 举报
回复
你在函数内分配内存,就是新的地址了;由于值传递的规则,它并不影响实际参数;malloc是在堆上分配内存,这块内存在函数返回时并不会被销掉,这样,你就造成了内存泄露
hittlle 2009-10-12
  • 打赏
  • 举报
回复
因为指针作为参数传递时也遵循值传递的规则,你不能改变指针本身,比如说
int a = 10;
int *p_a = &a;
func(p_a);
函数并不能使p_a指向别的什么,比如指向b;那是不行的
但你能改变p_a所指对像的值,也就是a的值
晨星 2009-10-12
  • 打赏
  • 举报
回复
书上说的不准确,不是“不能用”,有啥不能用的,语法上又没错。
关键是看你想干什么。
如果你想让重新分配的内存反映到实参上,在C语言中是没法直接办到的,因为参数传递都是值传递,函数内部对参数的修改不影响实参。但是你可以能过二级指针来间接实现,就像你的第二段代码那样。
dclchj 2009-10-12
  • 打赏
  • 举报
回复
void fun(int*q)
{
q=(int*)malloc(sizeof(int));
}

q只在函数 fun 中有效。为q分配的内存在函数结束后会被释放。
TianYiXiang 2009-10-12
  • 打赏
  • 举报
回复
void fun(int*q)
是q的一份拷贝指向分配空间的内存地址!

69,369

社区成员

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

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