Возвращает постоянную строку
Посмотрите на этот код:
символ * функция1() { верни «привет»
Где хранится строка приветствия? Есть копия?
Чего я хочу избежать, так это утечки памяти или доступа к другой строке вместо hello
Спасибо
@Bob5421, 👍-3
Обсуждение2 ответа
Лучший ответ:
Строковые литералы в C и C++ хранятся в статической памяти, которая в случае платформы Arduino является обычной памятью данных.
Если мы пропустим опечатки, ваш код по существу эквивалентен
char *function1()
{
static char literal[6] = { 'h', 'e', 'l', 'l', 'o', '\0' };
return literal;
}
с замечанием, что в C и C++ вам не разрешено изменять строковые литералы. (Некоторые нюансы также зависят от конкретного языка - C или C++, который вы не указали). Независимо от языка всегда лучше использовать указатели const char *
(в отличие от char *
) для указания на строковые литералы.
Здесь нет динамического выделения памяти, поэтому утечка памяти невозможна. Что вы подразумеваете под «доступом к другой строке», не ясно.
const char* function1() { return "hello"; }
Где хранится строка приветствия? Есть копия?
Строка компилируется в память программы. Перед вызовом setup() значения констант копируются в память данных (она же SRAM).
Функция вернет указатель на ту же строку (ячейку памяти).
Для экономии памяти данных строковый литерал может быть доступен непосредственно в памяти программы.
__FlashStringHelper* function1() { return F("hello"); }
Ура!
Ссылка.
- https://en.cppreference.com/w/cpp/language/string_literal
- https://www.nongnu.org/avr-libc/user-manual/pgmspace .html
Спасибо, но я не понимаю. Должен ли я использовать flashstringhelper и F(), чтобы все заработало. Для меня не имеет значения, где хранится строка. Я просто хочу прочитать его из вызывающей функции, @Bob5421
Первый вариант работает хорошо, но потребляет память данных. Чтобы избежать этого, можно использовать второй вариант, но он потребует использования специальных функций доступа. Пожалуйста, смотрите ссылки., @Mikael Patel
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Тайм-аут связи Arduino Mega с ошибкой программатора
На каком языке написан этот код? Какой смысл задавать вопрос про «код» без указания языка?, @AnT
это ардуино с, @Bob5421
Arduino C не поддерживает кавычки
«»
. В Arduino C оператор return должен заканчиваться символом;
., @AnT