今天在做FPU实验的时候,发现了个很奇怪的问题,仿照着原子哥的test.c敲出来的代码效果竟然不一样,大家先来找找茬,看下下面两句代码哪里不一样?!
~
~
~
咳咳...好了..不用看了.再看半天我猜你们也是会认为,这两个语句尼玛是复制出来的吧!?哪里不一样了!?
接下来我们来做下实验——
这是注释掉1号,留下2号的效果
这是注释掉2号,留下1号的效果
两张图片有什么不同?看左下角就知道了!一个有runtime,另一个没有!
为什么呢?这是相同的语句啊?!
唯一不同的是………………
~
2号语句是我直接复制原子哥例程的语句,1号语句是我自己敲出来的。
问题来了。。。。。我敲的为啥就不行呢??
~
~
经过一个1小时的检查,通过各种手段,检查生成的汇编代码,把这两个语句换位置,改变代码的位置等。。。。。发现
。。
。。
这两句代码真的不一样!
1号代码的zoom:%d后面的两个空格是
tab
2号代码的zoom:%d后面的两个空格是空格
把tab改成空格后,问题就解决了!
~
可是,根本问题还没解决,为什么tab会把字符串后面的内容隔绝掉显示不出来,而空格却不会?难道sprintf会以tab作为结束字符?
之后用仿真看了下打印到buf的内容,又检查了这个sprintf打印出来的buf的去处,找到下面一段代码——
还有他的定义
~
~
~
最后,问题终于迎刃而解了。。。sprintf并不会把tab作为结束符,tab还是打印到数组buf上了,问题就来源于这个函数的实现,它有个非法字符的判断,对照ASCII表,tab(0x09) 不在 空格(0x20) 到 ~(0x7e) 之间,因此被识别成非法字符,由此退出循环,TAB后面的东西也不在显示了!
~
~
希望这次的经验能够帮助到遇到同样问题的坛友们!这次的经历也让我明白到了事物的存在必定有其原因,有时候眼睛看到的并不一定是最真实的,结果不对,肯定还有我们忽略掉的东西。
很好,很cool
一周热门 更多>