void类型指针使用
来源:互联网 发布:淘宝购物车营销坑爹 编辑:程序博客网 时间:2024/04/30 04:21
1. 在调用设置IP地址问题现象
在设置VLAN后会调用SetOnuPonIpAddress函数去设置IP地址,函数代码实现过程如下
void SetOnuPonVlan(Word wVlanID, int Cos)
{
charszVlanCmd[100] = {0};
int *p_ponIp = NULL;
ushort_t ipLen = 0;
intip;
int mask;
int *p_ponMask = NULL;
ushort_t maskLen = 0;
STRU_OMCI_VOIP_SYS_IP stAddr;
/*取出ip地址和mask*/
rcDbGet(SipSys_IpAddr,POTS_SYS_NUM,&ipLen,(char**)&p_ponIp);
rcDbGet(SipSys_IpMask,POTS_SYS_NUM,&maskLen,(char**)&p_ponMask);
ip= *p_ponIp;
mask=*p_ponMask;
/*setvlan*/
…
/*setip address*/
printf("\r\nip-%x,mask-%x\r\n",ip,mask);
stAddr.dwIp = ip;
stAddr.dwMask = mask;
SetOnuPonIpAddress(&stAddr);
return;
}
设置IP函数代码实现过程如下:
void SetOnuPonIpAddress(void * inAddr)
{
/*define var*/
…
STRU_OMCI_VOIP_SYS_IP*pAddr = (STRU_OMCI_VOIP_SYS_IP *)inAddr;
if(NULL==pAddr)
return;
printf("7777ip:%d mask:%d\r\n", pAddr->dwIp, pAddr->dwMask);
/*Set ip */
…
return;
}
但在执行过程当中出现以下错误,导致系统重启。
ip-bc0aa8c0,mask-ffffff
777Alignment trap:pasuser (92) PC=0x0006bacc Instr=0xe5922000 Address=0x0024bcee FSR 0x013
7 ip:-1140152128mask:16777215
?
2. 其它测试问题现象
针对以上问题分别对以下情况测试
l 修改SetOnuPonIpAddress(STRU_OMCI_VOIP_SYS_IP*pinAddr)输入参数为(STRU_OMCI_VOIP_SYS_IP*)类型指针,
void SetOnuPonVlan(Word wVlanID, int Cos)
{
charszVlanCmd[100] = {0};
int *p_ponIp = NULL;
ushort_t ipLen = 0;
int ip;
intmask;
int *p_ponMask = NULL;
ushort_t maskLen = 0;
STRU_OMCI_VOIP_SYS_IP stAddr;
…
/*setip address*/
printf("\r\nip-%x,mask-%x\r\n",ip,mask);
stAddr.dwIp = ip;
stAddr.dwMask= mask;
SetOnuPonIpAddress(&stAddr);
return;
}
SetOnuPonIpAddress1(STRU_OMCI_VOIP_SYS_IP *pinAddr)
{
/*definevar*/
…
STRU_OMCI_VOIP_SYS_IP *pAddr = pinAddr;
if(NULL==pAddr)
return;
printf("ip:%dmask:%d\r\n", pAddr->dwIp, pAddr->dwMask);
/*Set ip */
…
return;
}
但在执行过程同样会出现上述错误提示,导致系统重启。
ip-6401000a,mask-ffffff
INPUT:stAddr=24cAlignmenttrap: pasuser (92) PC=0x0006be7cInstr=0xe5922000 Address=0x0024c4d6 FSR 0x013
4d61.output inAddr:0x24c4d6
2.output pnAddr:0x6b950
3.output inAddr:0x24c4d6
4.output pnAddr:0x24c4d6
在STRU_OMCI_VOIP_SYS_IP stAddr; stAddr地址值0x24c4d6是一个不对齐的地址值,输入到SetOnuPonIpAddress1(0x24c4d6)出现Alignment trap异常提示错误。
l 修改SetOnuPonIpAddress(STRU_OMCI_VOIP_SYS_IP**pinAddr)输入参数为(STRU_OMCI_VOIP_SYS_IP**)类型指针,
void SetOnuPonVlan(Word wVlanID, int Cos)
{
charszVlanCmd[100] = {0};
int *p_ponIp = NULL;
ushort_t ipLen =0;
int ip;
intmask;
int *p_ponMask = NULL;
ushort_t maskLen = 0;
STRU_OMCI_VOIP_SYS_IP *pstAddr;
…
/*setip address*/
printf("\r\nip-%x,mask-%x\r\n",ip,mask);
pstAddr->dwIp = ip;
pstAddr->dwMask = mask;
SetOnuPonIpAddress(&pstAddr);
return;
}
SetOnuPonIpAddress1(STRU_OMCI_VOIP_SYS_IP **pinAddr)
{
/*definevar*/
…
STRU_OMCI_VOIP_SYS_IP *pAddr = *pinAddr;
if(NULL==pAddr)
return;
printf("ip:%dmask:%d\r\n", pAddr->dwIp, pAddr->dwMask);
/*Set ip */
…
return;
}
可以正确执行。
l 修改SetOnuPonIpAddress(STRU_OMCI_VOIP_SYS_IPinAddr)输入参数为(STRU_OMCI_VOIP_SYS_IP**)类型指针,
void SetOnuPonVlan(Word wVlanID, int Cos)
{
charszVlanCmd[100] = {0};
int *p_ponIp = NULL;
ushort_t ipLen = 0;
int ip;
intmask;
int *p_ponMask = NULL;
ushort_t maskLen = 0;
STRU_OMCI_VOIP_SYS_IP stAddr;
…
/*setip address*/
printf("\r\nip-%x,mask-%x\r\n",ip,mask);
stAddr.dwIp = ip;
stAddr.dwMask = mask;
SetOnuPonIpAddress(stAddr);
return;
}
SetOnuPonIpAddress1(STRU_OMCI_VOIP_SYS_IP inAddr)
{
/*definevar*/
…
STRU_OMCI_VOIP_SYS_IP *pAddr = &inAddr;
if(NULL==pAddr)
return;
printf("ip:%dmask:%d\r\n", pAddr->dwIp, pAddr->dwMask);
/*Set ip */
…
return;
}
可以正确执行。
l 修改类型指针,
3. 几点总结:
1) 对于以上发生问题情况,只针对特定编译环境下的测试分析结果,对于其它类型的CPU,编译环境以下总结不一定成立。
2) 在STRU_OMCI_VOIP_SYS_IP stAddr; stAddr地址值0x24c4d6是一个不对齐的地址值,输入到SetOnuPonIpAddress1(0x24c4d6)出现Alignment trap异常提示错误,建议对定义的结构体中检查是否有不对齐的定义。
3) 对于用(void*)类型作为输入参数,因这个地址所指向类型及空间并不能确定,只表明这个地址是可以指向任何数据类型的指针,而它是作为一个输入参数,是不可以对其地址空间进行变化的,而在函数内部还需要对其进行强制类型转化,尤其对对齐要求严格的系统,是要对内存空间做对齐处理(是不是这个引起?),而这个地址指针参数所指向的空间是不允许对其重新检查修改。
4) 对于用(STRU_OMCI_VOIP_SYS_IP*)类型作为输入参数,只表明这个地址是指向STRU_OMCI_VOIP_SYS_IP*类型的指针,而它是作为一个输入参数,是不可以对其地址空间进行变化的,对于对对齐要求严格的系统,是要对内存空间做对齐处理(是不是这个引起?),而这个地址指针参数所指向的空间是不允许对其重新检查修改。
5) 对于用(STRU_OMCI_VOIP_SYS_IPinAddr)对象变量类型作为输入参数,表明对象变量地址空间大小完全能确定,对于对对齐要求严格的系统,是要对内存空间做对齐处理(是不是这个引起?),而这个对象变量参数所占用的空间是允许对其重新检查修改。
6) 对于用(STRU_OMCI_VOIP_SYS_IP **pinAddr) 指向指针的指针类型作为输入参数,表明*pinAddr里是一个地址值,是指向STRU_OMCI_VOIP_SYS_IP *类型的指针,而它并不是作为一个输入参数,而是作为一个指针变量,可以对其地址空间是可以变化。对于对对齐要求严格的系统,是要对内存空间做对齐处理(是不是这个引起?),而这个地址指针变量参数所指向的空间是允许对其重新检查修改。
软件开发的计划与跟踪
- void类型指针使用
- void类型及void指针
- void及void指针类型
- void及void指针类型
- void 和VOID指针类型
- void类型及void指针
- void类型及void指针
- void类型及void指针
- void类型及void指针
- void类型及void指针
- void类型及void指针
- void void* 空指针类型
- void类型及void指针
- void指针类型
- void指针类型
- void 指针类型例子
- void类型指针
- void类型指针
- MyBatis学习总结一
- Oracle异常整理
- Jackson 框架,轻易转换JSON
- Quicksum
- 数据结构基础(7) --循环队列的设计与实现
- void类型指针使用
- 第一章:taglib 原理和实现
- 用CocoaPods做iOS程序的依赖管理
- try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,还是在return之后执行?
- nyoj-27 水池数目(简单搜索)
- iOS开发系列--网络开发
- java String s = null; & String s="";
- django 模版关闭转义
- 记忆的品质