@LepikhinEgor
Java developer

Почему изменяется значение строки в памяти в Arduino?

У меня есть список структур, который хранится в классе как указатель на первый элемент списка:
Структура
struct SensorValue {
  String name;
  double value;
  bool constantly;
  SensorValue *next;
};

Записывается он корректно, вызовом метода sendValue вот так:
Запись в список
void Cloud::sendValue(String name, double value, bool constantly) {
  SensorValue newSensorValue;
  newSensorValue.name = name;
  newSensorValue.value = value;
  newSensorValue.constantly = constantly;
  newSensorValue.next = NULL;

  addSensorValue(&newSensorValue);
}

void Cloud::addSensorValue(SensorValue* value) {
  if (sensorsList == NULL) {
    sensorsList = value;
    return;
  }

  SensorValue* iter = sensorsList;
  while (iter->next != NULL) 
    iter = iter->next;

  (iter->next) = value;
}

Но при обращении к первому элементу из другого метода, значение поля name берется как будто из воздуха:
Обращение к списку
String requestBody = "{\"login\":\"" + login + "\",";
  requestBody += "\'password\':\"" + password + "\",";
  requestBody += "\"deviceName\":\"" + device + "\",";
  requestBody += "\"deviceType\":\"Arduino\",\"sensorsValue\":{";

 SensorValue* iter = sensorsList;
  Serial.println(sensorsList->name);
  Serial.println(sensorsList->value);
  Serial.println(sensorsList->next == NULL);

В этом примере значение sensorsList->name выводит значение "\"deviceName\":\"" + device + "\","; которое конкатенировалось выше. А следующие 2 значения выводятся корректно. Получается проблема именно со строкой
Почему так происходит и как это исправить?
  • Вопрос задан
  • 154 просмотра
Решения вопроса 1
WinPooh32
@WinPooh32
Stack Overflow answer searching expert
SensorValue newSensorValue;
 addSensorValue(&newSensorValue);

Потому что берется адрес на структуру, размещенную на стеке.
Так делать нельзя.

Выделяйте память через new или копируйте.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы