C ++缓冲区溢出或变量损坏

时间:2019-02-19 13:20:01

标签: c++ arduino

在传递意外消息时,此代码会导致缓冲区溢出吗?另外,预期的消息是简单的“ 1”和“ -1”。

char rcv[64] {};
  int i = 0;
  while (modem.available()) {
    rcv[i++] = (char)modem.read();
  }
  String data_received = rcv;
  if (data_received == "") {
    Serial.println("Null");
  } else {
    correction_var = data_received.toInt();
  }

由于我的arduino的RTC突然开始表现奇怪,并且我找不到适当的原因,除了在他发疯之前,显然一条消息未能发送到Arduino。此处的这段代码可以处理收到的消息,因此可能某些内容超出了应有的范围,并弄乱了RTC的警报变量?

更新:因此,这都不是缓冲区溢出问题,Ardunino的RTC显然存在某种问题,因为即使在重置代码后,问题仍然存在,这次从头开始,因此我决定创建一个新的线程Here

2 个答案:

答案 0 :(得分:4)

您只需读取无限数量的值,而无需检查缓冲区是否已满。从您的代码中:

char rcv[64] {};
int i = 0;
while (modem.available()) {
    rcv[i++] = (char)modem.read();
}

很明显,您的字符数组rcv在接收到64个字符后将溢出。也许一旦接收缓冲区已满,您应该停止阅读?

char rcv[64] {};
int i = 0;
while (modem.available() && i < 64) {
    rcv[i++] = (char)modem.read();
}

或者您可以在读取新值之后覆盖最旧的值。

char rcv[64] {};
int i = 0;
while (modem.available()) {
    rcv[i % 64] = (char)modem.read();
    ++i;
}

答案 1 :(得分:2)

如果modem.available()达到64时i返回true,则缓冲区将溢出。

此外,String data_received = rcv;可能会在rcv中寻找空终止符(我不知道String是如何实现的),该终止符可能不存在并且导致String读取rcv的末尾缓冲。