Проблема с возвратом Char из функции

Нужна функция добавления незначащего нуля перед числом на дисплее, написал такой код, но не работает корректно. Не могу понять в чем дело!

char buffer [5];

char* formatHours(int hours) {
  char bufH[10] = "0";
  char* concat = strcat(bufH, itoa(hours, buffer, 10));
  char* result = (hours<10) ? concat : itoa(hours, buffer, 10);
  //Serial.println(result); //Тут работает, выводит "07"!!!
  return result;
}

void loop {
  Serial.println(*formatHours(7)); // Должен вывести "07", но выводит "0", "7" теряет.
}

Из функции возвращается указатель на переменную, которая уничтожается после завершения работы функции.

“result” нужно объявить глобально?

Да, но тогда нет смысла что-то возвращать из функции.
Это какая-то загадка языка Си для меня. Возвращать указатель можно, но смысла в этом нет.
Хотелось бы от более грамотных ответ получить.
Если @ЕвгенийП увидит и развернуто ответит - будет более понятно (может быть даже я пойму)…

Может быть, дело не в указателе, а в том, на что он указывает?

1 лайк

Да не «может быть», а так и есть.

Я так понимаю, указывает на область памяти с массивом {“0”, “7”, “/0”}

А об области видимости что-то знаешь?

Да, область видимости переменной ограничивается процедурой, в которой она создана

Вот то-то и оно…

Объявил char* result; глобально, ничего не изменилось.

Весь код проекта слишком велик, я вырезал проблемный кусок:

Наврал. Указателю память нужно выделить ))

Я читал, что * в char* result[20] лишняя, нужно или char result[20] или char* result

Надо память указателю выделить перед использованием.
char* result = new char[20];

И потом вроде нужно очистить эту память при таком подходе?

Да, когда она больше не нужна.

Указатели - это динамическая память.

Спасибо за наводку, попробую!

Вообще «спасибо» нужно @rkit сказать. Он как умный кот - намекать умеет, а сказать сразу по человечески не может :smiley:

Я просто перевёл, когда сам понял его намёк ))

1 лайк