Daydream_realize 2020-11-23 15:18 采纳率: 0%
浏览 5

这个代码为什么不能正常执行?

如题,直接贴代码:
 int main(void)
 {
     int i = 0;
     static unsigned char input[300];
     int len = 0;
     unsigned char ch;

     while (scanf("%1x", &ch) == 1) {
         input[len++] = ch;
         printf("%d ", len);
     }
     return 959;
 }
当输入123456h的时候,正常执行,打印输出:1 2 3 4 5 6,如图:
 

如果把代码改一下,把第一行int注释掉,就不能正常执行了:
 int main(void)
 {
 //    int i = 0;
     static unsigned char input[300];
     int len = 0;
     unsigned char ch;

     while (scanf("%1x", &ch) == 1) {
         input[len++] = ch;
         printf("%d ", len);
     }
     return 959;
 }

当输入123456h的时候,打印输出:1 1 1 1 1 1,如图:


单步调试发现,进入while循环后,执行完里面的语句,进入下一循环时,变量len的值自动被置为0。

但如果我把ch变量定义中的char改为int,又正常了!如图:


为什么会这样?还请大佬们指点一下!
再然后,我把变量ch还是改回char类型,当我把第二个变量定义语句:
static unsigned char input[300];
的static去掉,改为:
unsigned char input[300];
程序又能正常运行了,如图:
 

太诡异额!真是百撕不得其姐!

  • 写回答

1条回答 默认 最新

  • 躺_ 2020-11-24 09:34
    关注

    我认为是越界了:

    使用%x向char类型输入时内存越界了  干扰到了前边声明的变量, (至于在内存中是i还是len挨着ch 应该有某种规则的)
     

    不注释i且使用i的情况下:

    
    #include <stdio.h>
    
     int main(void)
     {
         int i = 0;
         static unsigned char input[300];
         int len = 0;
         unsigned char ch;
         while (scanf("%1x", &ch) == 1) {
             input[len] = ch;
             printf("len=%d ", len);
            len ++;i++;
            printf("len = %d, i = %d\n", len, i);
    
         }
         return 959;
     }

    当将i 打印出来时 len就会

    将 i 和 len 的声明交换位置, 或者将i len 的声明放在ch后边都会产生不同的效果...
    能力有限,

    评论

报告相同问题?

悬赏问题

  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决