C / C ++ изменяет значение const - PullRequest
       21

C / C ++ изменяет значение const

18 голосов
/ 24 февраля 2009

У меня была статья, но я ее потерял. Он показал и описал пару приемов C / C ++, что люди должны быть осторожны. Один из них меня заинтересовал, но теперь, когда я пытаюсь воспроизвести его, я не могу его скомпилировать.

Концепция заключалась в том, что можно случайно изменить значение const в C / C ++

Это было примерно так:

const int a = 3;          // I promise I won't change a
const int *ptr_to_a = &a; // I still promise I won't change a
int *ptr;
ptr = ptr_to_a;

(*ptr) = 5;               // I'm a liar; a is now 5

Я хотел показать это другу, но сейчас я пропускаю шаг. Кто-нибудь знает, чего не хватает для начала компиляции и работы?

ATM Я получаю недопустимое преобразование из 'const int *' в 'int *' , но когда я прочитал статью, я попытался, и она отлично работала.

Ответы [ 17 ]

0 голосов
/ 24 февраля 2009

Некоторые из этих ответов указывают на то, что компилятор может оптимизировать переменную 'a', поскольку она объявлена ​​const. Если вы действительно хотите изменить значение a, вам нужно пометить его как volatile

  const volatile int a = 3; // I promise i won't change a
  int *ptr = (int *)&a;
  (*ptr) = 5; // I'm a liar, a is now 5

Конечно, объявление чего-то как const volatile действительно должно показать, насколько это глупо.

0 голосов
/ 24 февраля 2009

Вы, вероятно, хотите использовать const_cast:

int *ptr = const_cast<int*>(ptr_to_a);

Я не уверен на 100%, что это сработает, но я немного устала от C / C ++: -)

Некоторое чтение для const_cast: http://msdn.microsoft.com/en-us/library/bz6at95h(VS.80).aspx

0 голосов
/ 24 февраля 2009

Шаг, который вам не хватает, заключается в том, что вам не нужен указатель int *. Линия:

const int *ptr_to_a = &a; // I still promiss i won't change a;

фактически говорит, что вы не измените ptr_to_a, а не a. Так что если вы изменили код так, чтобы он читался так:

const int a = 3; // I promise I won't change a
const int *ptr_to_a = &a; // I promise I won't change ptr_to_a, not a.

(*ptr_to_a) = 5; // a is now 5

a теперь 5. Вы можете изменить сквозную ptr_to_a без предупреждения.

EDIT:

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

#include <iostream>
#include <boost/shared_ptr.hpp>

int main()
{
    const boost::shared_ptr<int>* a = new boost::shared_ptr<int>(new int(3));
    *(a->get()) = 5;
    std::cout << "A is: " << *(a->get()) << std::endl;

    return 0;
}

Будет производить 5.

0 голосов
/ 24 февраля 2009
const int foo = 42;
const int *pfoo = &foo;
const void *t = pfoo;
void *s = &t; // pointer to pointer to int
int **z = (int **)s; // pointer to int
**z = 0;
0 голосов
/ 12 апреля 2016

это создаст ошибку времени выполнения. Потому что int является статическим . Необработанное исключение. Место записи нарушения доступа 0x00035834.

void main(void)
{
    static const int x = 5;
    int *p = (int *)x;
    *p = 99;                //here it will trigger the fault at run time
}
0 голосов
/ 15 сентября 2018
#include<stdio.h>
#include<stdlib.h>

int main(void) {
    const int a = 1; //a is constant
    fprintf(stdout,"%d\n",a);//prints 1
    int* a_ptr = &a;
    *a_ptr = 4;//memory leak in c(value of a changed)
    fprintf(stdout,"%d",a);//prints 4
return 0;
}
0 голосов
/ 24 февраля 2009

В статье, которую вы просматривали, возможно, говорилось о разнице между

const int *pciCantChangeTarget;
const int ci = 37;
pciCantChangeTarget = &ci; // works fine
*pciCantChangeTarget = 3; // compile error

и

int nFirst = 1;
int const *cpiCantChangePointerValue = &nFirst;
int nSecond = 968;

*pciCantChangePointerValue = 402; // works
cpiCantChangePointerValue = &ci; // compile error

Или, как я помню, у меня нет ничего, кроме инструментов Java, поэтому не могу проверить :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...