跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YTM32B1M系列
  4. 局部变量赋值问题

局部变量赋值问题

已定时 已固定 已锁定 已移动 已解决 YTM32B1M系列
6 帖子 4 发布者 1.7k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • hjkjH 离线
    hjkjH 离线
    hjkj
    写于 最后由 hjkj 编辑
    #1

    IAR环境
    void test(void)
    {
    UINT8 A[4]={0x01,0x02,0x03,0x04};
    UINT8 B[4]={0x01,0x02,0x03,0x04};
    printf("%d,%d,%d,%d",A[0],A[1],A[2],A[3]);
    printf("%d,%d,%d,%d",B[0],B[1],B[2],B[3]);
    }
    发现数组B不等于{0x01,0x02,0x03,0x04}; 变为{0x75,0x46,0x85,0x68}
    函数改为如下测试:
    void test(void)
    {
    UINT8 A[4]={0x01,0x02,0x03,0x04};
    UINT8 B[4]={0x01,0x02,0x03,0x04};
    printf("%d,%d,%d,%d",A[0],A[1],A[2],A[3]);
    B[0]=0x01;
    B[1]=0x02;
    B[2]=0x03;
    B[3]=0x04;
    printf("%d,%d,%d,%d",B[0],B[1],B[2],B[3]);
    }
    发现数组A不等于{0x01,0x02,0x03,0x04}; 变为{0x75,0x46,0x85,0x68}

    函数改为如下测试:
    void test(void)
    {
    UINT8 A[4]={0x01,0x02,0x03,0x04};
    UINT8 B[4]={0x01,0x02,0x03,0x04};
    A[0]=0x01;
    A[1]=0x02;
    A[2]=0x03;
    A[3]=0x04;
    printf("%d,%d,%d,%d",A[0],A[1],A[2],A[3]);
    B[0]=0x01;
    B[1]=0x02;
    B[2]=0x03;
    B[3]=0x04;
    printf("%d,%d,%d,%d",B[0],B[1],B[2],B[3]);
    }
    两个数组数据均正确

    以上现象说明局部变量定义的时候初始化值有可能会被改变?使用的时候需要重新赋值?

    1 条回复 最后回复
    0
    • qinzhaoQ 离线
      qinzhaoQ 离线
      qinzhao YunTu
      写于 最后由 编辑
      #5

      UINT8 A[4]={0x01,0x02,0x03,0x04};是局部变量,printf("%d,%d,%d,%d",B[0],B[1],B[2],B[3]);是中断方式发送的,发送A[0]的地址在stack里;在退出void test(void)时,printf继续发送A[1]时,stack已经把test(void)和里面的局部变量原地址分配给下一个压栈的需求了,所以A[]原来地址里值已经变了。可以改成block和或者全局、static来解决。

      1 条回复 最后回复
      0
      • DigaD 离线
        DigaD 离线
        Diga
        写于 最后由 编辑
        #2

        看着像栈溢出了,你的这些变量被什么东西给冲掉了

        hjkjH 1 条回复 最后回复
        0
        • hjkjH 离线
          hjkjH 离线
          hjkj
          在 回复了 Diga 最后由 编辑
          #3

          Diga 感觉是像栈溢出,但是检查了下这个中途调用函数并没有特别大的局部变量,我先加大栈试试

          1 条回复 最后回复
          0
          • hjkjH 离线
            hjkjH 离线
            hjkj
            写于 最后由 编辑
            #4

            问题找到了:中途数组作为形参传递到函数,函数里面赋值溢出了,导致其他局部变量被改变

            1 条回复 最后回复
            1
            • qinzhaoQ 离线
              qinzhaoQ 离线
              qinzhao YunTu
              写于 最后由 编辑
              #5

              UINT8 A[4]={0x01,0x02,0x03,0x04};是局部变量,printf("%d,%d,%d,%d",B[0],B[1],B[2],B[3]);是中断方式发送的,发送A[0]的地址在stack里;在退出void test(void)时,printf继续发送A[1]时,stack已经把test(void)和里面的局部变量原地址分配给下一个压栈的需求了,所以A[]原来地址里值已经变了。可以改成block和或者全局、static来解决。

              1 条回复 最后回复
              0
              • FrankieF 离线
                FrankieF 离线
                Frankie YunTu
                写于 最后由 编辑
                #6

                云途的UNITY_PRINTF 里的打印是block的。不知道这个printf是如何实现的。

                1 条回复 最后回复
                0
                • ,FrankieF Frankie 将这个主题转为问答主题
                • ,FrankieF Frankie 将这个主题标记为已解决

              • 云途开发生态介绍

                快速上手云途开发生态

              • 云途论坛规则/Yuntu Forum Rules

                发帖前请查看

              • YT CONFIG TOOL调查问卷

                帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

              • can
                25
                demo
                22
                lin stack
                13
                uds
                13
                md14
                6
                yt-link
                6
                fbl
                5
                adc模块
                4
                Online Users
                • 登录

                • 登录或注册以进行搜索。
                • 第一个帖子
                  最后一个帖子
                0
                • 版块
                • 最新
                • 标签
                • 热门