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

 

软件开发的计划与跟踪

  
0 0
原创粉丝点击