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

123
03 октября 2019, 00:00

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

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

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 - нет? Как это работает?

Answer 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 * в этих языках нет. Такое преобразование можно сделать только явно. Но и явное преобразование не поможет вам "изменить константу".

Как это работает?

Никак не работает. Неопределенное поведение.

READ ALSO
Ошибка E0513 значение типа &ldquo;const wchar_t *&rdquo; нельзя присвоить сущности типа &ldquo;wchar_t *&rdquo;

Ошибка E0513 значение типа “const wchar_t *” нельзя присвоить сущности типа “wchar_t *”

Всем добрый деньПосмотрел много вариантов решения проблемы но что то ничего не помогает

569
c++: задать точность числа при выводе через printf

c++: задать точность числа при выводе через printf

Подскажите, как задать точность вывода float/double числа через printf?

148
Скопировать файл из одной папки в другую

Скопировать файл из одной папки в другую

Требуется скопировать файл из одной папки в другуюСделать это было решено через функцию "fileCopy()"

108
Как сохранить SpinnerAdapter при повороте экрана?

Как сохранить SpinnerAdapter при повороте экрана?

Я новичок в Андроиде , и во время разработки у меня возникла проблема с сохранением AndroidSpinner при повороте єкрана

162