В языке C строки реализованы как массивы символов, оканчивающиеся нулевым байтом ('\0'). Пример объявления строки:
char str1[] = "hello"; // Массив с 6 символами: {'h','e','l','l','o','\0'} char *str2 = "hello"; // Указатель на строковый литерал
const).Чтобы избежать ошибок:
malloc, strcpy, проверяйте размер буфера).\0.Пример корректной работы со строкой:
char buffer[100]; strcpy(buffer, "test"); // OK, buffer изменяемый и гарантированно содержит '\0'
Какой результат выполнения следующего кода и к каким ошибкам он приведёт?
char *str = "hello"; str[0] = 'H'; printf("%s ", str);
Ответ: Программа приведёт к неопределённому поведению, скорее всего — сегфолту, потому что строковые литералы размещаются в области памяти только для чтения. Записывать значения по адресу строкового литерала нельзя.
История Команда перепутала понятия массив строки и указатель на литерал. Одна функция принимала
char *output = "default";и далее выполнялаstrcpy(output, input);, что приводило к краху при первом же запуске, потому что копирование происходило в read-only память.
История При работе с сетью результат работы был записан в буфер, выделенный с помощью
char *buf = NULL; strcpy(buf, data);. Это привело к записи в неинициализированную память и краху приложения.
История В пакете для локализации команда передавала строки между компонентами, не удостоверившись, что добавлен символ
\0. Однажды функция вывела мусор в консоль и повредила внутреннюю структуру памяти.