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