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

c++ Buffer overflow or corrupted variables

本文关键字:变量 损坏 缓冲区 溢出      更新时间:2023-10-16

当交付意外消息时,此代码是否会导致缓冲区溢出?另外,预期的消息是简单的" 1"answers" -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显然存在某种问题,因为即使在重置代码后,问题仍然存在,这次是从一开始,我决定创建一个新的这里的线程。

您只是在不检查缓冲区是否已满的情况下读取无限量的值。从您的代码中:

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

很明显,您的Char-Array 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;
}

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

此外,String data_received = rcv;可能会在RCV中寻找null终结器(我不知道字符串是如何实现的),它可能不存在,并导致字符串读取 rcv buffer的末端。