Нуль-терминированная строка

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Нуль-термини́рованная или нуль-термина́льная строка́, также C-строка́ (от названия языка Си) или ASCIIZ-строка́ (от англ. Шаблон:Lang-en2) — способ представления строк в языках программирования, при котором вместо введения специального строкового типа используется массив символов, а концом строки считается первый встретившийся специальный нуль-символ (управляющий символ NUL с кодом Шаблон:0x).

Описание

Например, в строковом буфере (области памяти, выделенной для хранения строки) размером 11 байтов нуль-терминированная строка «СТРОКА» в кодировке Windows-1251 может представляться следующим образом:

С Т Р О К А NUL F % NUL 4
Шаблон:0x Шаблон:0x Шаблон:0x Шаблон:0x Шаблон:0x Шаблон:0x Шаблон:0x Шаблон:0x Шаблон:0x Шаблон:0x Шаблон:0x

В данном примере представлена область памяти из 11 байтов, хотя на самом деле строка занимает всего 7. Символы после нуль-символа (8—11 байты) называются мусором — это данные, которые могли остаться в буфере от предыдущих строк или от других использований памяти. Среди них также могут находиться нулевые символы.

При использовании однобайтовых кодировок (кодовых страниц), например Шаблон:Iw, объём памяти, требуемый для представления строки из N символов, равен Шаблон:S байт. В случае, когда для кодирования символов применяется Юникод, длина строки зависит от используемого представления Юникода (например, Шаблон:S байта для UTF-32) и (для UTF-8 и UTF-16) от кодируемого текста (от Шаблон:S до Шаблон:S байта для UTF-8, от Шаблон:S до Шаблон:S байтов для UTF-16).

Такие строки являются стандартом в Си и некоторых других языках программирования. Поскольку они используются для передачи строковых аргументов в стандартные функции во многих операционных системах, операции для работы с нуль-терминированными строками появились в Паскале и других языках.

Для работы с нуль-терминированной строкой используется указатель на её начало (символ с индексом 0). Это простой, быстрый и гибкий подход, но он чреват ошибками<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>. Программист постоянно должен следить за своим кодом, а именно:

  • быть уверенным, что не случаются переполнения буфера;
  • аккуратно проводить управление памятью, выделяемой под строки;
  • выполнять принудительное нуль-терминирование строк при использовании функций, которые его не гарантируют (например, Шаблон:Mono);
  • в редких случаях, когда размер строки может быть очень велик, следить, что не происходит переполнение целого при подсчёте длины и прочих связанных с длиной вычислениях.

Кроме того, некоторые операции со строками, например конкатенация, для нуль-терминированных строк выполняются медленнее, чем для других типов строк.

Сравнение с альтернативами

Альтернативой нуль-терминированным строкам являются способы, принятые в Паскале и современных объектно-ориентированных языках. В Паскале строка начинается с первого элемента массива, а в нулевом элементе хранится длина строки. В этом случае не требуется использовать специальный терминатор для обозначения конца строки. С другой стороны, здесь на длину строки накладывается ограничение, связанное с вместимостью нулевого элемента массива, то есть в случае с однобайтовыми символами длина строки не может превышать 255 символов. Нуль-терминированные строки такому ограничению не подвержены и теоретически могут иметь любую длину. В ОО-языках применяется хранение записи с длиной строки и ссылкой (или указателем) на массив символов. Эти способы лишены недостатка нуль-терминированных строк: они могут хранить в себе нуль-символы без искажений и специального кодирования.

В ряде интерфейсов применяются дважды-нуль-терминированные строки, признаком завершения которых является последовательность из двух нуль-символов<ref>What is the format of a double-null-terminated string with no strings?Шаблон:Ref Шаблон:Wayback / MSDN, 2009</ref>.

В языке Си

Для работы с нуль-терминированными строками в языке программирования Си используется ряд функций:

В языке ассемблера

В некоторых разновидностях языка ассемблера для определения нуль-терминированных строк используется специальная директива. Так, в GNU Assembler для этого есть директива .asciz<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>.

См. также

Примечания

Шаблон:Примечания

Литература

Ссылки

Шаблон:Язык программирования Си