Все три присваивания пытаются изменить объект через const-квалифицированный доступ и нарушают ограничения языка C. Компилятор должен выдать диагностику; корректного выполнения этих записей ожидать нельзя.
Проверка, сможет ли код успешно скомпилироваться и выполниться
Все три присваивания пытаются изменить объект через const-квалифицированный доступ и нарушают ограничения языка C. Компилятор должен выдать диагностику; корректного выполнения этих записей ожидать нельзя.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо выяснить, пройдет ли компиляцию данный фрагмент программы и, если компиляция успешна, выполнится ли он без ошибок. Рассмотрите следующий пример на C:
# include <stdio.h>
int main() {
const char *str = "123";
const char s[] = "abc";
str[0] = 'a';
*(s + 1) = '2';
s[0] = '1';
return 0;
}
Определите, какие из приведённых операций нарушают правила языка и приведут к ошибкам компиляции или выполнения.
Ответ
Все три присваивания пытаются изменить объект через const-квалифицированный доступ и нарушают ограничения языка C. Компилятор должен выдать диагностику; корректного выполнения этих записей ожидать нельзя.
str[0] имеет const char, как и элементы const-массива s. Даже если убрать const у указателя str, запись в строковый литерал остаётся неопределённым поведением.
Для изменяемых строк нужны массивы:
char str[] = "123";
char s[] = "abc";
str[0] = 'a';
s[1] = '2';
s[0] = '1';
Теперь изменяются собственные массивы, а не литералы. Снятие const приведением не делает реально константный объект безопасным для записи.