Обычно строковые литералы помещаются в раздел «данные только для чтения», который отображается в пространство процесса как доступный только для чтения (вот почему вы можете ' t изменить это).
Это зависит от платформы. Например, более простые архитектуры микросхем могут не поддерживать сегменты памяти только для чтения, поэтому сегмент данных будет доступен для записи.
Вместо этого попробуйте придумать трюк, чтобы сделать строковые литералы изменяемыми (это будет сильно зависеть от вашей платформы и может измениться со временем), просто используйте массивы:
char foo[] = "...";
Компилятор организует инициализацию массива из литерал, и вы можете изменить массив.
На этот вопрос нет единого ответа. Стандарты C и C++ просто говорят, что строковые литералы имеют статическую длительность хранения, любая попытка их модификации дает неопределенное поведение, а несколько строковых литералов с одинаковым содержимым могут разделять или не разделять одно и то же хранилище.
В зависимости от системы, для которой вы пишете, и возможностей формата исполняемого файла, который она использует, они могут храниться вместе с программным кодом в текстовом сегменте, или у них может быть отдельный сегмент для инициализированных данных.
Определение деталей также зависит от платформы - большинство, вероятно, включает инструменты, которые могут сказать вам, куда он их помещает. Некоторые даже дают вам контроль над подобными деталями, если вы этого хотите (например, gnu ld позволяет вам предоставить скрипт, который расскажет вам о том, как группировать данные, код и т.д.)
. gcc создает раздел .rodata
, который отображается «где-то» в адресном пространстве и помечается только для чтения,
Visual C ++ ( cl.exe
) создает ] .rdata
для той же цели.
Вы можете посмотреть вывод dumpbin
или objdump
(в Linux), чтобы увидеть разделы вашего исполняемого файла.
Например.
>dumpbin vec1.exe
Microsoft (R) COFF/PE Dumper Version 8.00.50727.762
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file vec1.exe
File Type: EXECUTABLE IMAGE
Summary
4000 .data
5000 .rdata <-- here are strings and other read-only stuff.
14000 .text
Это зависит от формата вашего исполняемого файла. Если бы вы программировали на ассемблере, вы могли бы поместить строковые литералы в сегмент данных вашей ассемблерной программы. Ваш компилятор языка C делает нечто подобное, но все зависит от того, для какой системы компилируется ваш двоичный файл.