Подтвердить что ты не робот

Хранилище типов данных типа С++

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

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

4b9b3361

Ответ 1

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

const char * x = "hello world";

Ответ 2

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

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

ELF Layout

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Да!

Ответ 5

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

Ответ 6

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

Ответ 7

Строковые литералы хранятся на сегменте DATA и распределяются во время компиляции. Это позволяет присваивать одинаковые строковые литералы нескольким переменным без создания копий строки.

e.g char * str = "hello";

Указатель str char, имеющий адрес char h, а "hello" хранится в сегменте данных и не может быть изменен. Попытка изменить его приведет к возникновению ошибки сегментации.

При назначении строкового литерала массива char создается копия строки в стеке.

i.e char str [] = "hello";

"hello" копируется в стек (добавляется нулевым символом), а str указывает на символ "h" в стеке.

Ответ 8

Прошло некоторое время с тех пор, как я играл с С++, но я помню, что у меня (с самообучением) была проблема со строками (ну, хорошо, массивы символов...).

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

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

Martin