Řetězec ukončený nulou

Řetězec zakončený nulou nebo C-řetězec (z názvu jazyka C ) nebo ASCIIZ-řetězec je způsob reprezentace řetězců v programovacích jazycích, ve kterém se místo zavedení speciálního typu řetězce používá pole znaků a první speciální znak null (NUL z kódu ASCII s hodnotou 0).

Popis

Například v řetězcové vyrovnávací paměti (paměťová oblast alokovaná pro ukládání řetězce) o velikosti 11 bajtů může být řetězec zakončený nulou „STRING“ v kódování Windows-1251 reprezentován následovně:

Z T R Ó Na ALE NUL F % NUL čtyři
0xD1 0xD2 0xD0 0xCE 0xCA 0xC0 0x00 0x46 0x25 0x00 0x34

V tomto příkladu je znázorněna paměťová oblast 11 bajtů, i když ve skutečnosti řádek zabírá pouze 7. Znaky za nulovým znakem (8 - 11 bajtů) se nazývají odpadky - to jsou data, která mohla zůstat ve vyrovnávací paměti z předchozích řádků nebo z jiného využití paměti. Mohou také obsahovat prázdné znaky.

Při použití jednobajtových kódování ( ASCII ) je množství paměti potřebné k reprezentaci řetězce N znaků N + 1 bajtů. Když se ke kódování znaků používá Unicode , délka řetězce závisí na použité reprezentaci Unicode (například 2N + 2 bajty pro UCS-2 ).

Takové řetězce jsou standardní v C a některých dalších programovacích jazycích. Protože se v mnoha operačních systémech používají k předávání řetězcových argumentů standardním funkcím , objevily se v Pascalu a dalších jazycích operace pro práci s řetězci ukončenými nulou.

K odkazování na řetězec ukončený nulou se používá ukazatel na jeho první znak. Jedná se o jednoduchý, rychlý a flexibilní přístup, ale náchylný k chybám [1] [2] . Programátor musí neustále sledovat svůj kód, a to:

Také některé operace s řetězci, jako je zřetězení , jsou pro řetězce ukončené nulou pomalejší než pro jiné typy řetězců.

Srovnání s alternativami

Alternativou k řetězcům ukončeným nulou jsou metody přijaté v Pascalu a moderních jazycích OOP. V Pascalu začíná řetězec na prvním prvku pole a délka řetězce je uložena v prvku null. V tomto případě není potřeba žádný speciální terminátor pro označení konce řádku. Na druhou stranu je zde délka řetězce omezena kapacitou nulového prvku pole, to znamená, že v případě jednobajtových prvků nesmí délka řetězce přesáhnout 255 znaků. Řetězce zakončené nulou nepodléhají tomuto omezení a teoreticky mohou ukládat řetězce libovolné délky. Objektově orientované jazyky ukládají záznam s délkou řetězce a odkazem (nebo ukazatelem) na pole znaků. Tyto metody netrpí nevýhodou řetězců zakončených nulou: mohou ukládat nulové znaky bez zkreslení a speciálního kódování.

Řada rozhraní používá řetězce zakončené dvojitou nulou, jejichž koncovým znakem jsou dva po sobě jdoucí nulové konce [3] .

V jazyce C

Pro práci s řetězci ukončenými nulou používá programovací jazyk C řadu funkcí :

V jazyce symbolických instrukcí

Některé varianty jazyka symbolických instrukcí používají speciální direktivu k definování řetězců zakončených NUL. Takže v GNU Assembler existuje směrnice .asciz[4] [5] pro toto .

Viz také

Poznámky

  1. Joel on Software - Zpět na základy (odkaz není k dispozici) . Získáno 17. září 2016. Archivováno z originálu 25. září 2016. 
  2. Nejdražší jednobajtová chyba – fronta ACM . Získáno 17. září 2016. Archivováno z originálu 19. září 2016.
  3. Jaký je formát řetězce zakončeného dvojitou nulou bez řetězců? Archivováno 13. února 2019 na Wayback Machine / MSDN, 2009
  4. Použití GNU assembleru jako.: Montážní směrnice . Získáno 17. září 2016. Archivováno z originálu 17. září 2016.
  5. Archivovaná kopie . Získáno 17. září 2016. Archivováno z originálu 17. září 2016.

Literatura

Odkazy