Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 30.06.2016
Сообщений: 13

Неожиданное поведение const_cast

07.01.2019, 09:21. Показов 884. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ощущаю себя свидетелем чуда.

Объясните пожалуйста, как это работает?

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
int main () {
 
    const int i = 10;
 
    int* j = const_cast<int*>(&i);
 
    *j += 10;
 
 
    printf("i addr = %p\n",&i);
    printf("j addr = %p\n",j);
 
    printf("i=%d\n",i);
    printf("j=%d\n",*j);
}
Выводит следующее:

C++ (Qt)
1
2
3
4
i addr = 0x7fffc2a95cdc
j addr = 0x7fffc2a95cdc
i=10
j=20
Как так получается, что i и j указывают на одну и ту же ячейку памяти, но printf выводит для них разные значения.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.01.2019, 09:21
Ответы с готовыми решениями:

Неожиданное поведение программы: почему не работает цикл while?
Проблема: Цикл While при != является бесконечным ,а при == не выполняется ни разу Ожидаемое поведение: После входа в цикл N должно быть...

Неожиданное поведение fflush(), неправильная работа функции
Никак не пойму почему код не хочет работать последовательно, так, как я ему указал.Что не так я делаю с fflush? Функция запрашивает лишь...

Неожиданное поведение программы: найти ошибку в коде
Программа запрашивает у пользователя «Сколько Вам лет?» . Вы вводите положительное число до 100. Программа должна выдать пол-ный ответ «...

7
 Аватар для Ovederax
604 / 404 / 212
Регистрация: 30.04.2017
Сообщений: 744
Записей в блоге: 1
07.01.2019, 09:38
При изменении константных переменных поведение неопределенно. форум + ссылки из яндекса по запросу "неопределенное поведение для изменения переменной с модификатором const"
1
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
07.01.2019, 10:12
Скорей всего, компилятор значение константной переменной и не хранил в памяти, а просто подставил его как если бы вы написали define i 10 а память он на неё выделил, т.к. адрес вы используете и работаете с ним, вот и получается, когда выводите из памяти, то выводит 20, а когда выводите i то компилятор просто подставляет значение 10
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
07.01.2019, 10:30
Ovederax,
Это при условии, если "обьект" изначально был const.
Если константа ссылается на данные, которые изначально неконстантные, то "снимать" константность можно, и менять данные по этому адресу тоже можно.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
07.01.2019, 10:50
Цитата Сообщение от ChaosGen Посмотреть сообщение
Ощущаю себя свидетелем чуда.
Какого такого "чуда"? Менять константные объекты в С++ не разрешается - поведение не определено. Неопределенное поведение вы и наблюдаете.

Цитата Сообщение от ChaosGen Посмотреть сообщение
Как так получается, что i и j указывают на одну и ту же ячейку памяти, но printf выводит для них разные значения.
Забудьте про "ячейки памяти". Современные платформы обладают сложной многоуровневой организацией хранилища: регистры процессора, кэши процессора, RAM, виртуальная память, своп на диске. И все это может быть между собой синхронизированно, а может и не быть синхронизированно. Сводить идею хранилища к банальным "ячейкам памяти" - бессмысленная затея.
1
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
07.01.2019, 14:57
Уж коли пошла такая пьянка, то предлагаю свой способ изменения константы:
C++
1
2
3
4
5
6
7
8
9
10
11
union A
{
    const int i = 10;
    int j;
};
int main() {
    A a;
    a.j+=10;
    cout<<a.i<<endl;
    cout<<a.j<<endl;
}
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
07.01.2019, 15:25
zss, если выводится 20 20, это ещё не значит, что в коде нет UB.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
07.01.2019, 16:17
Цитата Сообщение от Undisputed Посмотреть сообщение
Если константа ссылается на данные, которые изначально неконстантные, то "снимать" константность можно, и менять данные по этому адресу тоже можно.
Это возможно если создаётся константа адресного вида- указатель или ссылка на константу и инициализация проводится неконстантным объектом/адресом неконстантого объекта. Для константы - значения (пример ТС) - UB.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.01.2019, 16:17
Помогаю со студенческими работами здесь

Неожиданное поведение программы: исправить ошибку в коде
извиняюсь за возможно глупый вопрос, но почему программа говорит,что в выделенной строке ошибка? хотел написать в ней: а в квадрате + в в...

Неожиданное поведение программы: почему не работает цикл do while?
Здравствуйте,подскажите,пожалуйста,почему не работает цикл ... Условие корявое? //Напишите программу, которая по начальной сумме денег...

Циклы: неожиданное поведение программы (найти и исправить ошибки)
При попытке возобновления программы после использования рандомных чисел программа идет дальше, а не возвращается к циклу, нужна помощь. ...

Прохождение лабиринта: неожиданное поведение программы (найти и исправить ошибки)
Всем доброго времени суток. В общем написал я программу для генерации лабиринта и программу для его прохождения. В первой генерирую...

Вычислить значение функции (неожиданное поведение программы - как исправить?)
Мне нужно вичислить значение функции у= (4*(x^3)-2*(x^2)+5);для значении x от -3 до 1.Написан такой код: #include&lt;stdio.h&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru