Проверка, сможет ли код успешно скомпилироваться и выполниться

Все три присваивания пытаются изменить объект через 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 приведением не делает реально константный объект безопасным для записи.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее