打印

使用IAR for ARM时遇到的问题。

[复制链接]
2107|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
殷淼|  楼主 | 2011-8-27 14:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ARM, FOR, IAR, ui, ic
各位大虾:
有如下代码:
    if ( NULL == ( GUI_PAGE_3->menuIco =
              ( MENUICO * )malloc ( sizeof ( MENUICO ) * GUI_PAGE_3->Icon_Num )))
        {
        return ;
        }

    /*
    ...................
    */

        memcpy (GUI_PAGE_3->menuIco + sizeof ( MENUICO ), &tmpMIC, sizeof ( MENUICO ));
中间略去部分代码。
sizeof ( MENUICO )的大小为0x1c,GUI_PAGE_3->menuIco通过malloc分得的地址为0x200043B0,但是,一旦加上后面的偏移量的时候,就出问题了,直接加了0x310大小的偏移量,不知道什么原因,请问有谁能帮我解释一下吗?
沙发
殷淼|  楼主 | 2011-8-27 15:19 | 只看该作者
看了一下,汇编文件,
//  364                 memcpy (GUI_PAGE_3->menuIco + 0x1c/*sizeof ( MENUICO )*/, &tmpMIC, sizeof ( MENUICO ));
        MOV      R2,R5
        ADD      R1,SP,#+0
        LDR      R0,[R4, #+24]
        LDR      R0,[R0, #+32]
        ADDW     R0,R0,#+784
        BL       memcpy
784的确是,0x310,真太奇怪了!

使用特权

评论回复
板凳
殷淼|  楼主 | 2011-8-27 15:20 | 只看该作者
另外,0x1C * 0x1C = 0x310,到底是怎么回事呢?

使用特权

评论回复
地板
殷淼|  楼主 | 2011-8-27 16:50 | 只看该作者
没人顶啊,自己踩踩!:o

使用特权

评论回复
5
guet_new_man| | 2011-8-28 20:53 | 只看该作者
有两点感觉很奇怪:
第一点
if ( NULL == ( GUI_PAGE_3->menuIco = ( MENUICO * )malloc ( sizeof ( MENUICO ) * GUI_PAGE_3->Icon_Num ))),这样写不合适吧  建议分开,先分配地址,再检查是否成功分配了地址:
GUI_PAGE_3->menuIco = ( MENUICO * )malloc ( sizeof ( MENUICO ) * GUI_PAGE_3->Icon_Num) ;
if(NULL == GUI_PAGE_3->menuIco){}

第二点:
menuIco是指针变量还是普通的数据变量? 如果是普通的数据变量,那上面就应该写成&(GUI_PAGE_3->menuIco); 如果是指针变量,老衲就没啥疑问了。

使用特权

评论回复
6
guet_new_man| | 2011-8-28 21:02 | 只看该作者
补充一点:
memcpy (GUI_PAGE_3->menuIco + sizeof ( MENUICO ), &tmpMIC, sizeof ( MENUICO ));
偶也解释不清楚为什么会出现你说的上面那种情况,但是我建议你写代码时不要把一句话整的太复杂或者别嵌套太多,该分开的就分开,比较保险。如果写成如下格式,应该就不会有问题了,你不妨试试:
unsigned int delt = sizeof ( MENUICO );
memcpy (GUI_PAGE_3->menuIco + delt, &tmpMIC,  delt);

使用特权

评论回复
7
殷淼|  楼主 | 2011-8-30 13:49 | 只看该作者
知道为什么了,应该写成这个样子。
unsigned int delt = sizeof ( MENUICO );
memcpy (GUI_PAGE_3->menuIco + i, &tmpMIC,  delt);

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

92

帖子

0

粉丝