奇怪的C ++ Arduino串行行为

时间:2015-11-22 15:05:33

标签: c++ arrays arduino

我正在为我的arduino编写一些代码来打印4个按钮状态以及来自模拟操纵杆的X,Y坐标,我的行为很奇怪。

以下是代码:

  int x,y;
  x = analogRead(joy_x);
  y = analogRead(joy_y);
  char* buf = new char[4];
  sprintf(buf, "%4d", x);
  Serial.print("X:");
  Serial.print(buf);
  Serial.print(" Y:");
  sprintf(buf, "%4d", y);
  Serial.println(buf);

  int one,two,three,four;
  one = digitalRead(touchOne);
  two = digitalRead(touchTwo);
  three = digitalRead(touchThree);
  four = digitalRead(touchFour);

  // create an array of states set to the default values
  char states[4] = {'X', 'X', 'X', 'X'};
  // change each value if it is not in the default state
  if(one   == 1) states[0] = 'O';
  if(two   == 1) states[1] = 'O';
  if(three == 1) states[2] = 'O';
  if(four  == 1) states[3] = 'O';
  // output the states to the OLED display
  //display.print(states);
  Serial.print(states);

运行时,串行输出如下所示:

XXXX3X: 515 Y: 520
XXXX3X: 516 Y: 520
XXXX3X: 516 Y: 519
XXXX3X: 516 Y: 520
XXXX3X: 515 Y: 520
XXXX3X: 516 Y: 519
XXXX3X: 516 Y: 520
XXXX3X: 515 Y: 519
XXXX3X: 516 Y: 520

即使X,Y应该在XXXX之前,并且数字3从无处出现。 我希望这个谜可以解决,谢谢。

1 个答案:

答案 0 :(得分:1)

代码中有几个缓冲区溢出。

  char* buf = new char[4];
  sprintf(buf, "%4d", x);
  ...
  sprintf(buf, "%4d", y);

这需要sprintf添加的空终结符的空间。

  char* buf = new char[5];

也更容易:这里不需要使用免费商店。

  char buf[5];

这里有同样的事情:

  char states[4] = {'X', 'X', 'X', 'X'};
  ...
  Serial.print(states);

我们需要添加一个空终止符以使其成为有效的字符串。

  char states[5] = {'X', 'X', 'X', 'X', '\0'};

这应该关注眼前的记忆问题。