Arduino 字符数组奇怪的符号 回复评论:

问题描述

所以在我的 arduino 程序中,我在函数中使用字符数组。我尝试全局保存它们,但无论我怎么做,全局数组都只包含原始数组的一部分和大量乱码。

char* naam;
char* compliment;
byte color = 0;

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  
  doStuff();
  
  Serial.println(naam);
  Serial.println(compliment);
  Serial.println(color);
  
}

void loop() {
  // put your main code here,to run repeatedly:

}

void doStuff(){
  String raw = "1234567890123456,abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz,0";
  int i = raw.indexOf(",");
  int j = raw.indexOf(",",i+1);
  char a[i+1];
  char b[j-i];
  
  raw.substring(0,i).tochararray(naam,i+1);
  raw.substring(i+1,j).tochararray(compliment,j);
  color = (byte) raw.substring(j+2,j+3).toInt();
  Serial.println(a);
  Serial.println(b);

  naam = a;
  compliment = b;
}

谁能向我解释为什么这不起作用并为我指明正确的方向?

解决方法

这里创建两个字符数组 ab

char a[i+1];
char b[j-i];

在打印元素之前,您永远不会为其元素分配任何值。

因此,您将打印这些内存位置中的任何垃圾

回复评论:

它们由“toCharArray(compliment,j);”填充。的 println(a) 打印正确

当您第一次拨打 doStuff

您创建了两个未初始化的字符数组 ab。 然后将两个子字符串作为字符数组存储到 naamcompliment。两个未初始化的字符指针。因此,您基本上是将内容存储在内存中的随机位置。

然后打印包含随机垃圾的 ab

然后将 ab 中的地址存储到 naamcompliment

一旦 doStuff 返回 a 和 b 超出范围。 naamcompliment 仍然指向它们的位置,但该内存可以被其他东西自由使用。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...