查看: 674|回复: 9

[已解决] 定义两个数组,打印输出后发现会干扰

[复制链接]

该用户从未签到

发表于 2020-11-28 20:54 | 显示全部楼层 |阅读模式
本帖最后由 zk115 于 2020-12-10 11:44 编辑

我定义了两个数组,最后用串口打印发现两个数组连在一起了,请教是哪里的问题呢?

  1. char ABC[8] = {0xFF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7};
  2. char DDD[8] = {0xBF,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7};

  3. void setup() {
  4.   // put your setup code here, to run once:
  5. int i, j;
  6.     // 初始化串口
  7.   Serial.begin(115200);

  8.     for(i=0;i<20;i++){
  9.     Serial.printf("%x ",ABC[i]);
  10.   }

  11.     Serial.printf("\n");
  12.   for(i=0;i<20;i++){
  13.     Serial.printf("%x ",DDD[i]);
  14.   }
  15.   Serial.printf("\n");
  16. }
复制代码
最后打印出的结果是:
ff f1 f2 f3 f4 f5 f6 f7 e0 17 20 40 78 0 0 0 ff 0 0 0
bf b1 b2 b3 b4 b5 b6 b7 ff f1 f2 f3 f4 f5 f6 f7 e0 17 20 40


很奇怪,第1个数组后面多了一些,第二个数组后面包含了第一个

该用户从未签到

 楼主| 发表于 2020-11-28 21:17 | 显示全部楼层
顶一下,,,有没有大神帮忙看看!
  • TA的每日心情
    开心
    2021-1-27 02:01
  • 签到天数: 1380 天

    [LV.10]以坛为家III

    发表于 2020-11-30 11:56 | 显示全部楼层
    如果没看错,先不管语法对不对,你数组定义是8项,输出却是20项,自然有不确定数据被输出了咯

    该用户从未签到

    发表于 2020-11-30 13:57 | 显示全部楼层
    做错了事就不要说程序不讲武德

    该用户从未签到

     楼主| 发表于 2020-12-9 21:34 | 显示全部楼层
    上海老王 发表于 2020-11-30 11:56
    如果没看错,先不管语法对不对,你数组定义是8项,输出却是20项,自然有不确定数据被输出了咯 ...

    是这样的,我用Serial.printf("%s",DDD);去打印,结果发现打印出来的有两个数组的内容,所以才输出20项来测试,我知道这两个数组在内存中应该在隔壁,但是数组应该有结束符才对啊,好像C语言里面数组结束符就是0x00还是什么
  • TA的每日心情
    慵懒
    2021-1-27 06:53
  • 签到天数: 161 天

    [LV.7]常住居民III

    发表于 2020-12-9 22:28 | 显示全部楼层
    我知道這兩個數組在內存中應該在隔壁,但是數組應該有結束符才對啊,好像C語言裡面數組結束符就是0x00還是什麼

    你的意思是,每個陣列都應該要有所謂的"結束符"?
    可是你都規定陣列裡有多少筆資料了,為何系統還要雞婆地加上
    "結束符"來浪費你的記憶空間?

    我記得以前寫 BASIC 編譯器好像會在字串的最後面自動加上
    結束符來代表這個字串結束了,所以印出字串時只要給字串變數
    名稱,不論幾個字都會在字串印完後自動結束(因為有結束符),
    但 C 的"陣列"跟 BASIC 的"字串"差蠻大的吧,用陣列來做字串
    會變得複雜許多,同時也需要你給它特定的"結束符"來進行識別

    標題說"干擾",其實只是一個很正常的輸出結果,因為這種結果
    就是你的程式碼運行後的結果,並不是不如你所想的就叫做異常,
    有時是你所想的結果才是異常...
  • TA的每日心情
    开心
    2021-1-27 02:01
  • 签到天数: 1380 天

    [LV.10]以坛为家III

    发表于 2020-12-10 01:33 | 显示全部楼层
    zk115 发表于 2020-12-9 21:34
    是这样的,我用Serial.printf("%s",DDD);去打印,结果发现打印出来的有两个数组的内容,所以才输出20项来 ...

    你的概念没错,字符型数组确实会有结束符,称为空字符,但《arduino语法手册》有如下描述:
    “请注意,当声明一个char类型的数组时,你初始化的大小必须大于元素的个数,以容纳所需的空字符。”
    你声明的长度是8,自己写的数据也是8,就没有空间容纳空字符了(空字符可由编译器自动续上,但必须预留空间)。
    建议你下载打印一本手册在身边以备查。另外,系统虽然也认了你的printf用法,但手册里还是只列了print/println用法,arduino侧重于单片机,主要针对电气控制需求,那些花里胡哨的格式输出实际意义不大。

    该用户从未签到

     楼主| 发表于 2020-12-10 11:41 | 显示全部楼层
    上海老王 发表于 2020-12-10 01:33
    你的概念没错,字符型数组确实会有结束符,称为空字符,但《arduino语法手册》有如下描述:
    “请注意,当 ...

    感谢,您明了的解决了我的疑惑,,“初始化的大小必须大于元素的个数”这点有点和C语言不太一样,之前急于调试程序,并没有调试太久,当时我为了解决这个问题,直接声明了9个元素,并且手动在最后一位赋值了“0x00”,看来这个手动赋值是多余的了
  • TA的每日心情
    开心
    2021-1-27 02:01
  • 签到天数: 1380 天

    [LV.10]以坛为家III

    发表于 2020-12-24 22:24 | 显示全部楼层
    zk115 发表于 2020-12-10 11:41
    感谢,您明了的解决了我的疑惑,,“初始化的大小必须大于元素的个数”这点有点和C语言不太一样,之前急 ...

    哈哈,太久没上网了,刚看到,至于回复对你有用就好,不用客气,开源环境,交流为主
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    (开源)微信小程序控制esp8266,可远程
    (开源)微信小程序控制es
    流程说明:首先要使esp8266能够联网,能联网就可以控制,使用示例程序,修改WIFI、
    arduino封装了一个无线串口模块LC12S的操作库
    arduino封装了一个无线串
    前一段时间接触到一个比较好用的2.4G无线串口通信模块LC12S, 在淘宝上仅四五块钱,收
    【花雕动手做】快餐盒盖,极低成本搭建机器人实验平台
    【花雕动手做】快餐盒盖,
    吃完快餐粥,除了粥的味道不错之外,我对个快餐盒的圆盖子产生了兴趣,能否做个极低成
    全新AVR芯片ATMEGA328P烧录程序的教程
    全新AVR芯片ATMEGA328P烧
    潜水多年,觉得有义务贡献一些内容,此贴作为最近学习Arduino的一个总结。 玩Arduino
    【Arduino】168种传感器模块系列实验(90)--- ULN2003步进电机
    【Arduino】168种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表