Здравствуйте, Аноним, Вы писали:
А>Если нужна "постоянная" строка, то как раз-таки лучше писать const char str[] = "abcdef";
А>На счет массивов и указателей:
А>В случае const char *a = "abc"; под саму строку будет выделено четыре байта плюс на стеке (в случае локальной переменой) компилятор зарезервирует четыре байта для указателя и поместит туда адрес этой строки. В случае с глобальной — аналогично (четыре байта для самой строки и четыре байта на глобальный указатель). Если же у тебя есть const char b[] = "abc"; то здесь будет зарезервировано только четыре байта под саму строку без какого-либо указателя. При обращении к "а" (например printf(a)
будет использовано содержимое указателя "а" в то время как при обращении к "b" (printf(b)) будет использоваться какое-то постоянно значение (непосредственный адрес строки в памяти).
Мое понимание строк было нечетким. Теперь вроде все стало на свои места.
const char * sz = "TEXT";
выделяется память под указатель на строку находящуюся в отсеке RO (память на строку выделена на этапе компиляции, а под переменная в рантайме на стеке)
const char sz[] = "TEXT";
везде используется непосредственный адрес строки находящейся в RO (память выделена на этапе компиляции)
char * sz = "TEXT";
подозреваю. что зависит от компилятора.. Помнится 6.0 такую строку размещал в отсеке WR, а 7.1 — RO. Соответственно 7.1 падает при попытке скопировать что-нить в такой буфер (хотя компилит без предупреждений).
char sz[] = "TEXT";
непосредственный адрес строки выделенной в рантайме на стеке и скопированный из отсека RO. Самый медленный, но в такой буфер можно писать.
Т.е. сомнительным является 3 случай. Следует избегать, но думаю переписывать куски уже рабочего кода не нужно (конечно если строка не используется как буфер).