Chinaunix首页 | 论坛 | 博客
  • 博客访问: 573883
  • 博文数量: 493
  • 博客积分: 2891
  • 博客等级: 少校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 17:11
文章分类

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 18:43:47

1 现象:问题描述
某产品集成测试阶段,Server每次必core,分析core文件,函数CSrvSearchAddrListTool::SearchAddrListToKPConfirm传入pAddrMap指针为空
2 关键过程:根本原因分析
(1)   观察调用函数CSrvSearchAddrListTool::SearchAddrListToKPConfirm
SRV_STR2PVOID_MAP * pAddrMap = NULL;
if (true == rSrvSessWrapper->GetRecipientAddress(pAddrMap, N_SRV_RECIPIENT_TO))
{  
   enKPResultOfTO = CSrvSearchAddrListTool::SearchAddrListToKPConfirm(rSrvSessWrapper, inIndexofMainState, pAddrMap, EN_SRV_CHARGE_KP_OX3);
}
代码作者初衷是想pAddrMap作为rSrvSessWrapper->GetRecipientAddress的参数传入, 在函数内部完成赋值操作,然后将其值返回。显然,实际上代码实现失败了
(2)   分析函数rSrvSessWrapper->GetRecipientAddress
bool CSrvSession::GetRecipientAddress(SRV_STR2PVOID_MAP* pAddrMap,const EN_SRV_RECIPIENT_TYPE enRecipientType)
pAddrMap在函数体内重新赋值了,但是C语言函数参数默认是值传递的,因此pAddrMap变量值显然不会从函数参数返回出来
3 结论:解决方案及效果
(1)   C语言中函数参数是值传递的,这一点一定要根深蒂固的记住
(2)   如下代码能够很好的理解,最后输出i值为0
       void f(int j)
       {
           j = 100;
       }
       void main()
       {
           int   i =0;
           f(i);
           printf("%d", i);
}
       如果将i定义成指针变量,其效果是一样的,这一点一定要透彻理解和掌握(一样输出0)
       void f(int* j)
       {
           j = 100;
       }
       void main()
       {
           int*   i =0;
           f(i);
           printf("%d", i);
      }
         当将i定义成指针变量时,作为函数参数,不能返回指针变量值,只能返回指针变量指向地址的内容
(3)    问题代码可以通过如下方法来修正(为了方便描述,去掉enRecipientType参数描述)
a)   将pAddrMap定义成引用,从而指针变量能够从函数返回
         bool CSrvSession::GetRecipientAddress(SRV_STR2PVOID_MAP* &pAddrMap)
b)  地址直接从函数返回,不从参数走
         SRV_STR2PVOID_MAP* CSrvSession::GetRecipientAddress()
         函数体内return地址
c)   将pAddrMap定义成指针的指针
         bool CSrvSession::GetRecipientAddress(SRV_STR2PVOID_MAP** ppAddrMap)
         函数体内对* ppAddrMap赋值
         调用部分:
SRV_STR2PVOID_MAP* pAddrMap = NULL;
      rSrvSessWrapper->GetRecipientAddress(&pAddrMap);
4 经验总结:预防措施和规范建议
对值传递和应用传递一定要很好理解和掌握,多用,多熟练. 多总结,少犯错.
5 备注
6 考核点
值传递、引用传递、指针
7 试题
调用下列代码中的GetTest获取a的值,不能成功获取的是:AC
阅读(347) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~