Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Изменение констант через указатели в C vs C++

#cpp #c #указатели #const


Доброго времени суток.

В Си с помощью указателя я могу изменить значение константы.

const int a = 5;
int *p = &a;
*p = 10;
printf("%d", a);


Вывод:10

В Си++ компилятором допускается следующий код:

const int a = 5;
int *p = (int *) &a;
*p = 10;
std::cout << *p << " " << a;


Вывод:10 5

Значение по адресу указателя p изменилось, в то время как сама a - нет? Как это работает?
    


Ответы

Ответ 1



Ни в С, ни в С++ никаким способами не разрешается изменять значение константного объекта. Любые попытки такого изменения приводят к неопределенному поведению. Именно неопределенное поведение вы и наблюдаете в обоих своих примерах. Язык С 6.7.3 Type qualifiers 6 If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined. Язык С++ 9.1.7.1 The cv-qualifiers 4 Except that any class member declared mutable can be modified, any attempt to modify a const object during its lifetime results in undefined behavior. В Си с помощью указателя я могу изменить значение константы. Нет, конечно. Такая инициализация указателя не допускается ни в С, ни в С++ const int a = 5; int *p = &a; Неявного преобразования const int * к int * в этих языках нет. Такое преобразование можно сделать только явно. Но и явное преобразование не поможет вам "изменить константу". Как это работает? Никак не работает. Неопределенное поведение.

Комментариев нет:

Отправить комментарий