问题描述
所以在我的 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;
}
谁能向我解释为什么这不起作用并为我指明正确的方向?
解决方法
这里创建两个字符数组 a
和 b
char a[i+1];
char b[j-i];
在打印元素之前,您永远不会为其元素分配任何值。
因此,您将打印这些内存位置中的任何垃圾
回复评论:
它们由“toCharArray(compliment,j);”填充。的 println(a) 打印正确
当您第一次拨打 doStuff
您创建了两个未初始化的字符数组 a
和 b
。
然后将两个子字符串作为字符数组存储到 naam
和 compliment
。两个未初始化的字符指针。因此,您基本上是将内容存储在内存中的随机位置。
然后打印包含随机垃圾的 a
和 b
。
然后将 a
和 b
中的地址存储到 naam
和 compliment
。
一旦 doStuff
返回 a 和 b 超出范围。 naam
和 compliment
仍然指向它们的位置,但该内存可以被其他东西自由使用。