您的位置:首页 > 其它

void类型指针使用

2015-08-06 15:17 323 查看
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 *类型的指针,而它并不是作为一个输入参数,而是作为一个指针变量,可以对其地址空间是可以变化。对于对对齐要求严格的系统,是要对内存空间做对齐处理(是不是这个引起?),而这个地址指针变量参数所指向的空间是允许对其重新检查修改。

软件开发的计划与跟踪

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: