BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #37152同步于 2010/3/28
CPP机器人发帖

[合集] 请教关于返回值的问题

shenlei
2010/3/28镜像同步0 回复
☆─────────────────────────────────────☆ salooloo (salooloo) 于 (Thu Mar 25 10:16:02 2010) 提到: int cr_lsdb_router_find(struct cr_lsdb_router* result, u_int32_t rt_id, int lsdb_id) { int r; struct router_node* p; r = lsdb_router_find(rt_id, &p, (struct lsdb*)lsdb_id); if(!r) { result = (struct cr_lsdb_router*)malloc(sizeof(struct cr_lsdb_router)); *result = p->data; } return r; } 偶把result以形参的形式放在那里,其实是做返回值来用的,想让它返回p->data 可是,调用这个子函数后,result的值没能传出来,why?why?why? 在线等,非常感谢! ☆─────────────────────────────────────☆ salooloo (salooloo) 于 (Thu Mar 25 10:32:26 2010) 提到: 我用的编译器是eclipse 我也能确保if条件满足 调试过程中result的内容确实改变了,就是没传出来 ☆─────────────────────────────────────☆ jmpesp (民国沉思者|邓丽君) 于 (Thu Mar 25 10:44:49 2010) 提到: 【 在 salooloo 的大作中提到: 】 : int cr_lsdb_router_find(struct cr_lsdb_router* result, u_int32_t rt_id, int lsdb_id) : { : int r; : ................... 这样改 int cr_lsdb_router_find(struct cr_lsdb_router*& result, u_int32_t rt_id, int lsdb_id) 或者int cr_lsdb_router_find(struct cr_lsdb_router** result, u_int32_t rt_id, int lsdb_id) ☆─────────────────────────────────────☆ DrJan ( DrJan) 于 (Thu Mar 25 10:58:18 2010) 提到: 或者在调用者里分配空间 再把指针传进来 LZ现在这样和 void test(int a) { a = 1; } int main() { int b = 0; test(b); return 0; } 异曲同工 ☆─────────────────────────────────────☆ salooloo (salooloo) 于 (Thu Mar 25 11:10:15 2010) 提到: 不 完全不一样 我传的是指针,改变的是指针的内容 void test(int* a) { *a = 1; } int main() { int b = 0; test(&b); return 0; } 我的是这种形式 【 在 DrJan 的大作中提到: 】 : 或者在调用者里分配空间 再把指针传进来 : LZ现在这样和 : void test(int a) : ................... ☆─────────────────────────────────────☆ salooloo (salooloo) 于 (Thu Mar 25 11:11:17 2010) 提到: 改成双指针是能解决问题 但我觉得我那样写也没错啊 【 在 jmpesp 的大作中提到: 】 : 这样改 : int cr_lsdb_router_find(struct cr_lsdb_router*& result, u_int32_t rt_id, int lsdb_id) : 或者int cr_lsdb_router_find(struct cr_lsdb_router** result, u_int32_t rt_id, int lsdb_id) ☆─────────────────────────────────────☆ Blunt (DEK) 于 (Thu Mar 25 11:18:16 2010) 提到: 若!r成立,你的result指针就变了,和实参的指针不一样,此时改变的不是实参指向的对象的值。result是复制传递的,你若想通过它传递出值,result不能变。 ☆─────────────────────────────────────☆ jmpesp (民国沉思者|邓丽君) 于 (Thu Mar 25 11:33:35 2010) 提到: 【 在 salooloo 的大作中提到: 】 : 改成双指针是能解决问题 但我觉得我那样写也没错啊 你那写的是错的 怎么会没错 形参是传值的 ☆─────────────────────────────────────☆ Blunt (DEK) 于 (Thu Mar 25 12:01:43 2010) 提到: 呵呵,这个是没问题的,指针是值传递没错,所以result有一个指针副本,和实参是指向同一个对象的,对result所指对象的操作因此就是对实参所指对象进行操作。 【 在 jmpesp 的大作中提到: 】 : 你那写的是错的 怎么会没错 : 形参是传值的 ☆─────────────────────────────────────☆ jmpesp (民国沉思者|邓丽君) 于 (Thu Mar 25 12:11:59 2010) 提到: 【 在 Blunt 的大作中提到: 】 : 呵呵,这个是没问题的,指针是值传递没错,所以result有一个指针副本,和实参是指向同一个对象的,对result所指对象的操作因此就是对实参所指对象进行操作。 你离题了 注意看清题目 ☆─────────────────────────────────────☆ Blunt (DEK) 于 (Thu Mar 25 12:37:59 2010) 提到: 但按她的意思,她不是要通过result返回p->data吗?呵呵。 【 在 jmpesp 的大作中提到: 】 : 你离题了 注意看清题目 ☆─────────────────────────────────────☆ jmpesp (民国沉思者|邓丽君) 于 (Thu Mar 25 12:42:40 2010) 提到: 【 在 Blunt 的大作中提到: 】 : 但按她的意思,她不是要通过result返回p->data吗?呵呵。 形参跟实参非同一内存单元 ☆─────────────────────────────────────☆ Blunt (DEK) 于 (Thu Mar 25 12:48:47 2010) 提到: 这个我也知道的。她如果确实是为了仅传result的值,那我错了,没看清题意。看她的描述,我怎么觉得她只是想通过result传其指向的内容啊。 【 在 jmpesp 的大作中提到: 】 : 形参跟实参非同一内存单元 ☆─────────────────────────────────────☆ DrJan ( DrJan) 于 (Thu Mar 25 13:06:45 2010) 提到: 仔细想想 其实是一样的 因为你传了一个指针 然后在被调里面 对这个指针malloc赋值 注意你malloc的时候是对这个指针赋值 然后你把向malloc到的内存中填充内容 这一点没错 但是你返回以后 你穿进去的指针的值没变 并不是你malloc分配的地址 真的和我说的例子是一个原理 【 在 salooloo 的大作中提到: 】 : 不 完全不一样 我传的是指针,改变的是指针的内容 : void test(int* a) : { : ................... ☆─────────────────────────────────────☆ rainblue (everyday BUPT & BYR) 于 (Thu Mar 25 14:20:55 2010) 提到: 【 在 salooloo 的大作中提到: 】 : int cr_lsdb_router_find(struct cr_lsdb_router* result, u_int32_t rt_id, int lsdb_id) : { : int r; : ................... result = (struct cr_lsdb_router*)malloc(sizeof(struct cr_lsdb_router)); 这句话去掉即可。。 ☆─────────────────────────────────────☆ wangzb (校园古惑仔) 于 (Thu Mar 25 14:38:25 2010) 提到: re,同不明白为什么还要malloc一个,后面谁负责来释放呢,函数的调用者吗。。。 【 在 rainblue 的大作中提到: 】 : result = (struct cr_lsdb_router*)malloc(sizeof(struct cr_lsdb_router)); : 这句话去掉即可。。 ☆─────────────────────────────────────☆ salooloo (salooloo) 于 (Thu Mar 25 15:56:16 2010) 提到: 恩 我确实是想通过result返回p->data 【 在 Blunt 的大作中提到: 】 : 但按她的意思,她不是要通过result返回p->data吗?呵呵。 ☆─────────────────────────────────────☆ Blunt (DEK) 于 (Thu Mar 25 16:25:25 2010) 提到: 哦,那现在你知道原因了吧? 【 在 salooloo 的大作中提到: 】 : 恩 我确实是想通过result返回p->data ☆─────────────────────────────────────☆ salooloo (salooloo) 于 (Thu Mar 25 18:25:18 2010) 提到: 恩 找到了 malloc应该在主调函数中 谢谢大家 【 在 Blunt 的大作中提到: 】 : 哦,那现在你知道原因了吧? ☆─────────────────────────────────────☆ jmpesp (民国沉思者|邓丽君) 于 (Thu Mar 25 18:27:02 2010) 提到: 【 在 salooloo 的大作中提到: 】 : 恩 找到了 malloc应该在主调函数中 : 谢谢大家 这个不一定吧 看需求了 你那样写也不见得就不优雅
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。