Как вернуть значение массива символов в функции Arduino IDE?

Функция

char* getConnectDetail(int starting){
  String data;
  for(int i=0;i< 1024 ;i++) {
    if(EEPROM.read(i+starting) != 0){
    data += char(EEPROM.read(i+starting)); 
    }
   } 

   int str_len = data.length() + 1;
  char char_array[str_len];
  data.toCharArray(char_array, str_len);
  return char_array;
}

Когда я вызываю его, я получаю значение мусора... без создания функции нет никакой ошибки. Пожалуйста, решите это. Я просто хочу знать, что не так с моим методом возврата.

, 👍0

Обсуждение

для будущей помощи при поиске в Интернете, это не «функция Arduino IDE» ... это «функция C++», @jsotola


1 ответ


1

char char_array[str_len]; является локальным для функции — он создается при входе в функцию, а его память освобождается при выходе из функции. Содержимое этой памяти не определено после ее освобождения, и ее данные могут быть или не быть действительными.

Если вызывающая сторона создает данные и передает их функции, она переживает весь вызов функции и возврат, и вызывающая сторона находит в ней правильные данные. Другой (менее элегантный) способ сделать это — сделать data глобальным объектом, что, опять же, дает ему большее время жизни, чем у функции, но глобальные объекты подвержены случайной перезаписи и злоупотреблению со стороны другие функции, поэтому их не рекомендуется использовать, если они действительно не являются лучшим решением в данной ситуации.

,

Хороший ответ. Другая альтернатива - иметь память функции malloc для массива и возвращать ее. Тогда вызывающий абонент будет нести ответственность за его освобождение, когда с ним будет покончено., @Duncan C

Также обратите внимание, что функция OPs должна каким-то образом вернуть длину массива строк., @Duncan C

Поскольку ему больше не нужно возвращать массив (он принадлежит вызывающему объекту), возвращаемое значение доступно для возврата количества или кода ошибки., @JRobert