![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Sasha |
|
|||
|
Unregistered |
Ребята объясните как храняться во внутреннем формате строки.
1) Как хрянятся строки типа String в Паскале; 2) Как хранятся строки типа PChar тоесть с нулевым символом в конце. Например: Я задаю строку: <<йцукйцукцйукцу>> Как эта строка будет выглядеть в двоичной системе счисления ? Перевод каждого символа в двоичную систему счисления, это не правильный ответ. |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Тип String:
по смещению -2 храниться длина строки по смещению -4 храниться счётчик ссылок на строку (когда он обнуляется строка уничтожается) Сама строка располагается в памяти как есть - каждая буква занимает 1 байт. При копировании строки: s1:=s2 - реального копирования не происходит, увеличивается только счётчик ссылок, но если после этого изменить одну из строк: s1:=s1+'a'; то произойдёт физическое копирование содержимого строк, и теперь s1 и s2 будут показывать на разные адреса памяти. PChar - длина строки определяется от начала до #0 байта, по сути это чистой воды pointer, так что все действия по отслеживанию распределения памяти лежат на программисте - сами заботьтесь о том чтобы хватило места для распределения памяти и освобождении после использования. Тоже одна буква = 1 байт Для хранения unicode (т.е. 2х байтовых символов) используйте соответствующие символы с приставкой Wide... -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Fantasist |
|
||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Поправка!
Пожалуй, это процессозависимо и скорее всего sizeof(Cardinal). У меня эти смещения -4 и -8 соответственно. Причем, если переменная string объявлена локально в процедуре, то счетчик ссылок на нее не храниться - она освобождается при выходе из процедуры.
Это тоже верно только если s1 - локальная переменная, или s1 и s2 - обе не локальные. Если s1 не локальная(глобальная или член класса), а s2 - локальная происходит копирование. Все это верно для Delphi6 про другие версии утверждать не буду. P.S. Я бы вообще в это дело не полез, только я когда-то раньше делал дамп строки, и не видел там никакого счетчика(теперь понимаю почему), а по смещению -4 была длина. Это все я и впаривал усердно народу. А теперь, тут такое заявление - пришлось глянуть по внимательнее. -------------------- Волны гасят ветер... |
||||
|
|||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Кстати тут в Delphi6 у меня глюк нашелся с функцией StrAlloc - котороя выделяет память под строку и возвращает PChar. Это очевидно, если глянуть в исходник:
Как видно, выделяется память размером Size+SizeOf(Cardinal) , и в первые(предшествующие) четыре байта (у меня SizeOf(Cardinal)=4) записывается Size. Только, видно они забыли, что Size перед этим был увеличен на sizeof(Cardinal). В результате у меня был глюк при преобразовании PChar к String - в String попадали лишние символы. -------------------- Волны гасят ветер... |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Сорри, бес попутал! Конечно -4 и -8... -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |