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) |