Устройство хранения данных типа данных строкового литерала C++

void f()
{
    char *c = "Hello World!"
}

Где строка хранится? Каково свойство его? Я просто знаю, что это - константа, что еще? Я могу возвратить его изнутри тела функции?

21
задан David Pfeffer 24 February 2010 в 17:17
поделиться

7 ответов

Обычно он хранится в разделе памяти, доступном только для чтения, и имеет статическое распределение памяти.

Выполнение операций типа c [0] = 'k' и т. Д. Вызывает неопределенное поведение.

Могу ли я вернуть его из тела функции?

Да!

5
ответ дан 29 November 2019 в 20:32
поделиться

Я давно не играл с C ++, но я помню, что у меня (самоучка) было множество проблем со строками (ну ладно, массивы символов ...).

Если вы собираетесь вообще изменять их значение, обязательно используйте ключевые слова new и delete ... Что-нибудь в этом роде ...

char *strText = new char[10];
/* Do something
...
...
...
*/
delete [] strText;

Мартин

-3
ответ дан 29 November 2019 в 20:32
поделиться

он упакован вместе с вашим двоичным файлом - под упакованным я имею в виду аппаратный, так что да, вы можете вернуть его и использовать в другом месте - вы не будете тем не менее, у вас есть возможность изменить его, и я настоятельно рекомендую вам объявить его как:

const char * x = "hello world";
22
ответ дан 29 November 2019 в 20:32
поделиться

Строка сохраняется в области данных программы. Это полностью зависит от компилятора, исполняемого формата и платформы. Например, двоичный файл ELF помещает его в другое место, чем исполняемый файл Windows, и если вы компилируете для встроенной платформы, эти данные могут храниться в ПЗУ, а не в ОЗУ.

Вот иллюстрация структуры формата ELF:

ELF Layout

Ваши строковые данные, скорее всего, будут находиться в разделах .data или .text , в зависимости от компилятора.

Вы, конечно, можете вернуть его из тела функции. Просто проверьте свою реализацию, чтобы убедиться, что это произвольный доступ, так как многие реализации не позволят вам перезаписать ее.

8
ответ дан 29 November 2019 в 20:32
поделиться

§2.14.15 Строковые литералы, раздел 7

Узкий строковый литерал имеет тип "массив из n const char", где n - размер строки, как определено ниже, и имеет статическую длительность хранения.

6
ответ дан 29 November 2019 в 20:32
поделиться

Он имеет статическую продолжительность хранения, поэтому он существует на протяжении всего жизненного цикла программы. Точное место, куда компилятор / компоновщик помещает инициализированные данные, различается. Возврат указателя на него из функции - это нормально, но убедитесь, что вы возвращаете char const * - запись в строку вызывает неопределенное поведение.

3
ответ дан 29 November 2019 в 20:32
поделиться

Его реализация определена. В большинстве случаев это будет храниться в таблице строк вместе со всеми другими строками в вашей программе. Обычно вы можете рассматривать его как глобальную статическую константную переменную, за исключением того, что она недоступна вне вашей функции.

1
ответ дан 29 November 2019 в 20:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: