W języku C łańcuchy są realizowane jako tablice znaków, kończące się bajtem zerowym ('\0'). Przykład deklaracji łańcucha:
char str1[] = "hello"; // Tablica z 6 znakami: {'h','e','l','l','o','\0'} char *str2 = "hello"; // Wskaźnik na literał łańcuchowy
const).Aby unikać błędów:
malloc, strcpy, sprawdzaj rozmiar bufora).\0.Przykład poprawnej pracy z łańcuchem:
char buffer[100]; strcpy(buffer, "test"); // OK, buffer jest zmienny i gwarantuje zawartość '\0'
Jaki będzie wynik wykonania następującego kodu i do jakich błędów doprowadzi?
char *str = "hello"; str[0] = 'H'; printf("%s ", str);
Odpowiedź: Program doprowadzi do nieokreślonego zachowania, prawdopodobnie — błędu segmentacji, ponieważ literały łańcuchowe umieszczane są w obszarze pamięci tylko do odczytu. Nie wolno przypisywać wartości pod adresem literału łańcuchowego.
Historia Zespół pomylił pojęcia tablica łańcucha i wskaźnik na literał. Jedna funkcja przyjęła
char *output = "default";i następnie wykonałastrcpy(output, input);, co prowadziło do awarii podczas pierwszego uruchomienia, ponieważ kopiowanie następowało w pamięci tylko do odczytu.
Historia Podczas pracy z siecią wynik działania był zapisywany w buforze, przydzielonym za pomocą
char *buf = NULL; strcpy(buf, data);. Doprowadziło to do zapisu w nieinicjalizowanej pamięci i awarii aplikacji.
Historia W pakiecie lokalizacyjnym zespół przekazywał łańcuchy między komponentami, nie upewniwszy się, że dodano znak
\0. Pewnego razu funkcja wydrukowała śmieci w konsoli i uszkodziła wewnętrzną strukturę pamięci.