You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:45:54