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

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

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

Why Does Modifying a Constant through a Non-const Pointer Produce Undefined Behavior?

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

В предоставленном фрагменте кода вы выражаете недоумение по поводу поведения изменения целочисленной константы (e) с помощью неконстантного указателя (w):

const int e = 2;

int* w = (int*) &e;  // Casting to remove const-ness
*w = 5;            // Modifying the value pointed to by w

После внесения этого изменения вы заметили, что:

  • Отображение значения, на которое указывает w ( cout w
  • Однако отображение значения e (*cout

Кроме того, вы заметили, что адрес, на который указывает w совпадает с адресом e (cout cout e остается неизменным, несмотря на модификацию, сделанную с помощью w.

Такое поведение возникает из-за неопределенного поведения, которое возникает при изменении константы через неопределенный параметр. -константный указатель. После внесения такого изменения код попадает на территорию неопределенного поведения, где он становится непредсказуемым и зависит от конкретных деталей реализации.

В этом случае оказывается, что изменение с помощью w влияет на временная копия e во время выполнения, в то время как исходный e остается неизменным. Причина этого в том, что e рассматривается как константа времени компиляции, и ее значение жестко закодировано в двоичном коде. Таким образом, любые изменения во время выполнения w не повлияют на исходный e.

Это поведение специфично для используемой реализации, и на него не следует полагаться. Изменение константных данных с помощью неконстантных указателей считается плохой практикой, и ее следует избегать. Правильный подход — использовать неконстантную ссылку или создать неконстантную копию данных, которые вы собираетесь изменить.

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

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

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

Copyright© 2022 湘ICP备2022001581号-3