这是 Arduino 代码,但我有一种感觉,我的错误一般是与 C++ 相关,而不是特定于 Arduino。我对指针和字符串很陌生,所以我在这方面可能做错了什么。
这是来自一个更大的程序,但我已将其缩减为尽可能少的代码,这样我仍然可以重现该错误。
它应该只迭代 的字母text[]并将每个字母保存到 中newText[0][0],以及 printnewText[0][0]和 counter 变量i。
void setup() {
Serial.begin(9600);
}
void loop() {
const char text[] = "chunk";
static char newText[][10] = {};
static unsigned int i=0;
static int code = 0;
if(code == 0){
newText[0][0] = text[i]; //This
Serial.print(i);
Serial.println(newText[0][0]); //This
i++;
if(i>=strlen(text)){
code=1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我有代码时,i在第二次迭代时跳转到某个数字,例如 104,此时它应该等于 1。(确切的值根据代码的具体外观而变化。)如果我注释掉其中任何一行评论//This,然后计数器工作正常。另外,如果我切换Serial.print(i);它之前的行,那么它就可以了。
static char newText[][10] = {};
Run Code Online (Sandbox Code Playgroud)
这将创建一个零大小的数组(更准确地说是 0 行 10 列的矩阵)。这在 C++ 中是非法的,但 gcc 有一个扩展允许这样做。然而,即使使用 gcc 的扩展,当您访问newText[0][0]超出数组大小的内容时,它也是 UB。当你拥有 UB 时,任何事情都可能发生,程序看起来可以按你的预期工作,它可以打印乱码,它可以崩溃,等等,几乎任何事情。
因此,您需要声明一个可容纳所有访问的大小,例如:
static char newText[1][10] = {};
Run Code Online (Sandbox Code Playgroud)
如果您只想要 1 行(但在这种情况下您不需要矩阵,一维数组就可以了)。
提示:对字符串使用String类,而不是原始数组。