ŁAŃCUCHY ZNAKÓW W JĘZYKU C 131 Należy cały czas pamiętać, że napis jest tak naprawdę tablicą. Jeśli zarezerwowaliśmy dla napisu 80 znaków, to przypisanie do niego dłuższego napisu spowoduje pisanie po pamięci . Uwaga! Deklaracja char *tekst = cokolwiek; oraz char tekst = cokolwiek; pomimo, że wyglądają bardzo podobnie bardzo się od siebie różnią. W przypadku pierwszej deklaracji próba zmodyfikowania napisu (np. tekst[0] = ’C’;) może mieć nieprzyjemne skutki. Dzieje się tak dlatego, że char *tekst = cokolwiek; deklaruje wskaźnik na stały obszar pamięci 1. Pisanie po pamięci może czasami skończyć się błędem dostępu do pamięci (“segmentation fault” w systemach UNIX) i zamknięciem programu, jednak może zdarzyć się jeszcze gor- sza ewentualność — możemy zmienić w ten sposób przypadkowo wartość innych zmiennych. Program zacznie wtedy zachowywać się nieprzewidywalnie — zmienne a nawet stałe, co do których zakładaliśmy, że ich wartość będzie ściśle ustalona, mogą przyjąć taką wartość, jaka absolutnie nie powinna mieć miejsca. Warto więc stosować zabezpieczenia typu makra assert. Kluczowy jest też kończący napis znak null. W zasadzie wszystkie funkcje operujące na napisach opierają właśnie na nim. Na przykład, strlen szuka rozmiaru napisu idąc od początku i zliczając znaki, aż nie natrafi na znak o kodzie zero. Jeśli nasz napis nie kończy się znakiem null, funkcja będzie szła dalej po pamięci. Na szczęście, wszystkie operacje podstawienia typu tekst = “Tekst” powodują zakończenie napisu nullem (o ile jest na niego miejsce) 2. Znaki specjalne Jak zapewne zauważyłeś w poprzednim przykładzie, w łańcuchu ostatnim znakiem jest znak o wartości zero (’\0’). Jednak łańcuchy mogą zawierać inne znaki specjalne(sekwencje sterujące), np.: • ’\a’ - alarm (sygnał akustyczny terminala) • ’\b’ - backspace (usuwa poprzedzający znak) • ’\f’ - wysuniecie strony (np. w drukarce) • ’\r’ - powrót kursora (karetki) do początku wiersza • ’\n’ - znak nowego wiersza • ’\”’ - cudzysłów • ’\” - apostrof • ’\\’ - ukośnik wsteczny (backslash) • ’\t’ - tabulacja pozioma • ’\v’ - tabulacja pionowa • ’\?’ - znak zapytania (pytajnik) • ’\ooo’ - liczba zapisana w systemie oktalnym (ósemkowym), gdzie ’ooo’ należy zastąpić trzycyfrową liczbą w tym systemie • ’\xhh’ - liczba zapisana w systemie heksadecymalnym (szesnastkowym), gdzie ’hh’ na- leży zastąpić dwucyfrową liczbą w tym systemie
(…)
… *foo; int *bar = foo; generuje ostrzeżenie lub
wręcz się nie kompiluje. Jest to pewna zaszłość historyczna wynikająca, z faktu, że słówko const
zostało wprowadzone do języka, gdy już był on w powszechnym użyciu.
2 Nie należy mylić znaku null (czyli znaku o kodzie zero) ze wskaźnikiem null (czy też NULL).
…
... zobacz całą notatkę
Komentarze użytkowników (0)