0

我正在转换一个带符号的 int 以通过 Arduino Wire 作为多个字节发送,所以我执行了以下操作:

下面的代码是我实现的调试,你可以复制到 Arduino IDE 中查看打印输出。

我无法理解的是 itoa 如何创建一个大于声明大小的数组,而sizeof()无法检测到该数组。我声明的数组大小为2,但 itoa 使用大小为6的数组来存储其结果!

Serial.println("|----START DEBUG------|");
int Sensor1Data=-32760;
Serial.print("Sensor1Data: ");Serial.println(Sensor1Data);
byte Sensor1CharMsg[2];

Serial.println("|----STAGE 2------|");
Serial.print("Array Size b4 itoa: ");Serial.println(sizeof(Sensor1CharMsg));
itoa(Sensor1Data,(char*)Sensor1CharMsg,10);
Serial.print("Array Values up to 10 elements: ");Serial.write(Sensor1CharMsg,10); Serial.println("");
Serial.print("Array Size a4tr itoa: ");Serial.println(sizeof(Sensor1CharMsg));

Serial.println("||||||| ARRAY OUTPUT|||||||");
Serial.print("Sensor1CharMsg[0]): ");  Serial.println(Sensor1CharMsg[0]);
Serial.print("Sensor1CharMsg[1]): ");  Serial.println(Sensor1CharMsg[1]);
Serial.print("Sensor1CharMsg[2]): ");  Serial.println(Sensor1CharMsg[2]);
Serial.print("Sensor1CharMsg[3]): ");  Serial.println(Sensor1CharMsg[3]);
Serial.print("Sensor1CharMsg[4]): ");  Serial.println(Sensor1CharMsg[4]);
Serial.print("Sensor1CharMsg[5]): ");  Serial.println(Sensor1CharMsg[5]);
Serial.println("|||||||END ARRAY OUTPUT|||||||");

传输后:

int Sensor2Data = atoi((char*)Sensor1CharMsg);
Serial.print("Sensor2Data: ");Serial.println(Sensor2Data);

结果

|----START DEBUG------|
Sensor1Data: -32760
|----STAGE 2------|
Array Size b4 itoa: 2
-32760
Array Size a4tr itoa: 2
||||||| ARRAY OUTPUT|||||||
Sensor1CharMsg[0]): 45
Sensor1CharMsg[1]): 51
Sensor1CharMsg[2]): 50
Sensor1CharMsg[3]): 55
Sensor1CharMsg[4]): 54
Sensor1CharMsg[5]): 48
|||||||END ARRAY OUTPUT|||||||

传输后

Sensor2Data: -32760
4

1 回答 1

4

您正在覆盖内存,调用未定义的行为。

此外,itoa()不完全创建一个“字节数组”,它创建一个字符串。该名称的意思是“整数到 ASCII”。文档说:

调用者负责提供足够的存储 [...]

最后,字符串的长度是由 计算的strlen(),而不是由计算的sizeof

于 2013-04-02T12:37:36.033 回答