void f()
{
char *c = "Hello World!"
}
Где хранится строка? Какая собственность? Я просто знаю, что это постоянный, что еще? Могу ли я вернуть его изнутри тела функции?
void f()
{
char *c = "Hello World!"
}
Где хранится строка? Какая собственность? Я просто знаю, что это постоянный, что еще? Могу ли я вернуть его изнутри тела функции?
он упакован вместе с вашим двоичным файлом - упакованным я подразумеваю жесткую проводку, так что да, вы можете вернуть его и использовать его в другом месте - вы не сможете его изменить, хотя я настоятельно рекомендую вам объявить его как
const char * x = "hello world";
Строка сохраняется в области данных программы. Это полностью компилятор, исполняемый формат и зависимая от платформы. Например, двоичный файл ELF помещает это в другое место, чем исполняемый файл Windows, и если вы компилируете встроенную платформу, эти данные могут быть сохранены в ПЗУ вместо ОЗУ.
Вот иллюстрация макета формата ELF:
Ваши строковые данные, скорее всего, будут найдены в разделах .data
или .text
, в зависимости от компилятора.
Вы можете, конечно, вернуть его изнутри тела функции. Просто проверьте с помощью своей реализации, чтобы убедиться, что это произвольный доступ, так как многие реализации не позволят вам перезаписать его.
§2.14.15 Строковые литералы, раздел 7
Узкий строковый литерал имеет тип "array of n const char", где n - размер строки, как определено ниже, и имеет статическую продолжительность хранения.
Обычно он хранится в разделе только для чтения памяти и имеет статическое распределение хранилища.
Выполнение таких операций, как c[0] = 'k'
и т.д. вызывает Undefined Поведение.
Можно ли вернуть его изнутри тела функции?
Да!
Он имеет статическую продолжительность хранения, поэтому он существует на протяжении всей жизни программы. Точно там, где компилятор/компоновщик помещает инициализированные данные, меняется. Возврат указателя к нему из функции в порядке, но обязательно верните char const *
- запись в строку вызывает поведение undefined.
Определена реализация. В большинстве случаев это будет храниться в строковой таблице со всеми остальными строками в вашей программе. Как правило, вы можете рассматривать его как глобальную статическую константную переменную, за исключением того, что она недоступна вне вашей функции.
Строковые литералы хранятся на сегменте DATA и распределяются во время компиляции. Это позволяет присваивать одинаковые строковые литералы нескольким переменным без создания копий строки.
e.g char * str = "hello";
Указатель str char, имеющий адрес char h, а "hello" хранится в сегменте данных и не может быть изменен. Попытка изменить его приведет к возникновению ошибки сегментации.
При назначении строкового литерала массива char создается копия строки в стеке.
i.e char str [] = "hello";
"hello" копируется в стек (добавляется нулевым символом), а str указывает на символ "h" в стеке.
Прошло некоторое время с тех пор, как я играл с С++, но я помню, что у меня (с самообучением) была проблема со строками (ну, хорошо, массивы символов...).
Если вы собираетесь изменить свое значение вообще, обязательно используйте новые и удаляйте ключевые слова... Что-то в этом направлении...
char *strText = new char[10];
/* Do something
...
...
...
*/
delete [] strText;
Martin