Re[7]: char* или char[]
От: kliff Россия http://www.esignal.ru
Дата: 03.01.04 17:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Если нужна "постоянная" строка, то как раз-таки лучше писать 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 случай. Следует избегать, но думаю переписывать куски уже рабочего кода не нужно (конечно если строка не используется как буфер).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.