Здравствуйте, kliff, Вы писали:

const char * sz = "TEXT";
K>выделяется память под указатель на строку находящуюся в отсеке RO (память на строку выделена на этапе компиляции, а под переменная в рантайме на стеке)

Около того. Литерал "TEXT" может быть размещен в read-only памяти, но не обязательно. Существенным является то, что отдельно существует литерал "TEXT" (массив пяти const символов), и отдельно — указатель sz на первый элемент этого массива.

const char sz[] = "TEXT";
K>везде используется непосредственный адрес строки находящейся в RO (память выделена на этапе компиляции)

Формально существует литерал "TEXT", под который выделена память, плюс память под содержимое массива sz, в который скопированы символы литерала "TEXT". На практике некоторые компиляторы, естественно, могут использовать одну и ту же память как для литерала, так и для массива sz.

char * sz = "TEXT";
K>подозреваю. что зависит от компилятора.. Помнится 6.0 такую строку размещал в отсеке WR, а 7.1 — RO. Соответственно 7.1 падает при попытке скопировать что-нить в такой буфер (хотя компилит без предупреждений).

Размещение строковых литералов в read-only или read-write памяти в любом случае зависит от компилятора и его настроек и не зависит от того, какие указатели инициализируются данными литералами.

char sz[] = "TEXT";
K>непосредственный адрес строки выделенной в рантайме на стеке и скопированный из отсека RO. Самый медленный, но в такой буфер можно писать.

Формально это эквивалентно const char sz[] = "TEXT" за исключением того, что содержимое массива можно модифицировать. Однако, действительно, практически отсутствие const означает то, что компилятор вынужден копировать содержимое литерала в массив и не будет использовать одну и ту же память для литерала и массива sz.

K>Т.е. сомнительным является 3 случай. Следует избегать, но думаю переписывать куски уже рабочего кода не нужно (конечно если строка не используется как буфер).


Вывод верен.
Автор: Павел Кузнецов    Оценить