«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему изменение константной переменной с помощью неконстантного указателя работает, но на самом деле не меняет ее значение?

Почему изменение константной переменной с помощью неконстантного указателя работает, но на самом деле не меняет ее значение?

Опубликовано 7 ноября 2024 г.
Просматривать:586

Why Does Modifying a `const` Variable Through a Non-Const Pointer Seem to Work, but Doesn\'t Actually Change Its Value?

Изменение константы с помощью неконстантного указателя

В C константная переменная не может быть изменена после инициализации. Однако в некоторых сценариях может показаться, что константная переменная была изменена. Рассмотрим следующий код:

const int e = 2;

int* w = (int*)&e;        // (1)
*w = 5;                   // (2)

cout 

Если вы запустите этот код, вы заметите неожиданное поведение:

5
2

Несмотря на то, что *w было изменено на 5 в (2), e по-прежнему сохраняет свое исходное значение 2. Такое, казалось бы, парадоксальное поведение обусловлено следующими факторами:

  • (1 ) Разыменование константного указателя (w) допускает его модификацию.
  • (2) Измененное значение сохраняется в ячейке памяти, на которую указывает w, которая в данном случае является ячейкой памяти, где хранится e.
  • Однако компилятор оптимизирует код, рассматривая e как константу времени компиляции и не оценивая ее во время выполнения.

В результате, когда *w вычисляется во время выполнения, он возвращает измененное значение (5). Однако когда e оценивается во время компиляции, используется его исходное значение (2).

Такое поведение известно в C как неопределенное поведение. Изменение константной переменной прямо или косвенно приводит к непредсказуемым последствиям, и в таких ситуациях следует проявлять осторожность.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3