String - это массив символов.
String объявленный без параметра
size ,
динамически изменяется в зависимости от длины строки. Длина может
варьироваться от 0 байт до 2 гигабайт. Дескриптор содержит указатель на
фактическую строку, длину строки и количество пространства, выделенного для
нее.
VarPtr возвращает указатель
на дескриптор, а
StrPtr будет
указывать на фактическую строку.
Из-за скрытого дескриптора
String, ручное распределение
памяти, например с помощью функции выделения памяти
CAllocate (преимущественно),
для
String не рекомендуется. Распространенным способом для
обеспечения определенного объема пространства резервируемого для
String,
для предотвращения ненужных выделений внутри цикла , заключается в
использовании функций
Space или
String.
Тем не менее , при необходимости динамического распределения, можно
использовать функции выделения памяти
Allocate,
CAllocate,
Reallocate (см.
меры предосторожности при использовании) и строковой указатель (который
является указателем на дескриптор строки, а не строковые данные). Когда
память выделяется для хранения дескрипторов строки, строка всегда должна
быть уничтожена (установить
"") прежде чем освобождать
каждый дескриптор строки (позволяя освобождать память, принятых строковых
данных), в противном случае не возможно освободить его позже, и это может
вызвать утечку памяти в программе.
Несмотря на использование дескриптора, неявный символ NULL (
Chr(0))
добавляется в конец строки, чтобы разрешить передачу их в функции внешних
библиотек не делая медленные копии. FreeBASIC внутренние функции будут
игнорировать этот символ и не рассматривать его как часть строки.
String объявленные с
фиксированным размером являются
строками фиксированной длины QB-стиля, за исключением того, что
неиспользуемые символы имеют значение 0, независимо от того, какая опция
компилятора "-lang" используется. Она не имеет дескриптор и она не
изменяется в соответствии с ее содержимым. Как и в QB , если данные
превышают размер строки, они усекаются по правой стороне.
Строки фиксированной длины также завершаются нулевым символом, и поэтому они
используют
size + 1 байт для пространства. Этот
NULL
терминатор в будущем может быть удален для предотвращения избыточных
символов, усложняющих структуры данных в пользовательских
Type.
Имена строковых переменной не нужно заканчивать знаком доллара
$
как и в других диалектах BASIC. В диалекте
lang fb
суффиксы переменных, в том числе знак доллара, запрещены полностью.
Примечание: При передаче
String в качестве параметров в
Процедуры, они всегда должны быть
переданы по ссылке (
ByRef). В
настоящее время,
ByVal не передает
копию строки, а
Pointer
на строковые данные. Это может привести к непредсказуемому поведению в том
числе порчу
String. Если вы хотите, чтобы предотвратить
значения
String от изменения, вы должны добавить
Квалификатор Const
к соответствующему параметру.
См. также