Возвращает постоянную строку

Посмотрите на этот код:

символ * функция1() { верни «привет»

Где хранится строка приветствия? Есть копия?

Чего я хочу избежать, так это утечки памяти или доступа к другой строке вместо hello

Спасибо

, 👍-3

Обсуждение

На каком языке написан этот код? Какой смысл задавать вопрос про «код» без указания языка?, @AnT

это ардуино с, @Bob5421

Arduino C не поддерживает кавычки «». В Arduino C оператор return должен заканчиваться символом ;., @AnT


2 ответа


Лучший ответ:

1

Строковые литералы в C и C++ хранятся в статической памяти, которая в случае платформы Arduino является обычной памятью данных.

Если мы пропустим опечатки, ваш код по существу эквивалентен

char *function1()
{
  static char literal[6] = { 'h', 'e', 'l', 'l', 'o', '\0' };
  return literal;
}

с замечанием, что в C и C++ вам не разрешено изменять строковые литералы. (Некоторые нюансы также зависят от конкретного языка - C или C++, который вы не указали). Независимо от языка всегда лучше использовать указатели const char * (в отличие от char *) для указания на строковые литералы.

Здесь нет динамического выделения памяти, поэтому утечка памяти невозможна. Что вы подразумеваете под «доступом к другой строке», не ясно.

,

0
const char* function1() { return "hello"; }

Где хранится строка приветствия? Есть копия?

Строка компилируется в память программы. Перед вызовом setup() значения констант копируются в память данных (она же SRAM).

Функция вернет указатель на ту же строку (ячейку памяти).

Для экономии памяти данных строковый литерал может быть доступен непосредственно в памяти программы.

__FlashStringHelper* function1() { return F("hello"); }

Ура!

Ссылка.

  1. https://en.cppreference.com/w/cpp/language/string_literal
  2. https://www.nongnu.org/avr-libc/user-manual/pgmspace .html
,

Спасибо, но я не понимаю. Должен ли я использовать flashstringhelper и F(), чтобы все заработало. Для меня не имеет значения, где хранится строка. Я просто хочу прочитать его из вызывающей функции, @Bob5421

Первый вариант работает хорошо, но потребляет память данных. Чтобы избежать этого, можно использовать второй вариант, но он потребует использования специальных функций доступа. Пожалуйста, смотрите ссылки., @Mikael Patel