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

YunTu Forum

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

局部变量赋值问题

已定时 已固定 已锁定 已移动 YTM32B1M系列
6 帖子 4 发布者 108 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 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
    • DigaD 离线
      DigaD 离线
      Diga
      写于 最后由 编辑
      #2

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

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

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

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

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

          1 条回复 最后回复
          1
          • qinzhaoQ 离线
            qinzhaoQ 离线
            qinzhao
            写于 最后由 编辑
            #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

            • 云途论坛规则/Yuntu Forum Rules

              发帖前请查看

            • YCT离线License申请流程

              帮助没办法联网的电脑使用YCT

            • YT CONFIG TOOL调查问卷

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

            • demo
              12
              can
              9
              lin stack
              6
              yt-link
              5
              vscode
              3
              adc模块
              2
              i2c
              2
              uuid
              2
              Online Users
              yt0069Y
              yt0069
              • 登录

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