Arduino字符数组意外被覆盖问题求助及代码修正方案需求
Arduino字符数组被意外覆盖的问题排查与修复
问题根源
你定义字符数组的方式char tripchar[] = "";只会给数组分配1字节的存储空间(仅够存放字符串结束符\0)。当调用tripSt.toCharArray(tripchar, tripleng+1);时,实际需要写入的字符数远大于1字节,这就触发了内存越界写入——超出数组存储空间后,数据会写到相邻的内存区域中。
后续定义的userbattery2[] = "";同样只有1字节空间,它的内存位置刚好和tripchar的越界写入区域重叠;或者在写入userbattery2时,同样的越界操作直接覆盖了tripchar所在的内存,最终导致两个字符数组的内容互相干扰。
修复方案
方案1:预先分配足够大小的字符数组
先估算字符串的最大可能长度,直接定义足够大的数组(留好余量),避免内存越界:
// 定义60字节的数组,足够容纳你的字符串内容(留余量) char tripchar[60] = {0}; char userbattery2[60] = {0}; // 后续的toCharArray操作可以正常执行 tripSt.toCharArray(tripchar, tripleng+1); batterySt.toCharArray(userbattery2, leng+1);
这种方式简单直接,适合字符串长度可控的场景。
方案2:动态分配内存
如果字符串长度不确定,可以根据实际长度动态分配内存,更灵活:
// 创建tripchar int tripleng = tripCommaIndexb; char* tripchar = (char*)malloc(tripleng + 1); // +1用于存储字符串结束符 if(tripchar != NULL){ // 必须检查内存分配是否成功 tripSt.toCharArray(tripchar, tripleng + 1); } // 创建userbattery2 int leng = firstCommaIndexb; char* userbattery2 = (char*)malloc(leng + 1); if(userbattery2 != NULL){ batterySt.toCharArray(userbattery2, leng + 1); } // 注意:不再使用这些数组时,要释放内存避免泄漏 // free(tripchar); // free(userbattery2);
方案3:直接使用String对象(最省心)
既然你已经在使用Arduino的String类处理字符串,完全可以直接用String对象代替字符数组,内存管理由系统自动完成:
// 直接保留String对象即可,无需转字符数组 String tripSt = tripUserString.substring(0,tripCommaIndexb); String batterySt = UserString.substring(0,firstCommaIndexb); // 直接打印或使用String对象,不会出现覆盖问题 Serial.println("trip1"); Serial.print(tripSt); Serial.println("battery"); Serial.print(batterySt); Serial.println("trip2"); Serial.print(tripSt);
这种方式无需手动管理内存,日常开发中最便捷,只要不是极端频繁创建销毁String导致内存碎片,完全可以正常使用。
内容的提问来源于stack exchange,提问作者user1114881
相关产品推荐
相关产品推荐

