Разыменование преинкрементного указателя дает странный результат

Этот вопрос должен быть глупым, но я не могу понять, почему это происходит

int main()
{
int i=20;
int *p=&i;
cout<<"old p="<<p<<endl;
*(++p) = 10;
cout<<"p="<<p<<endl;

}

В этом коде я получаю вывод как:
старый р = 0x22ff08
р = окс

Почему значение указателя меняется на 10 (0xa) вместо увеличения предыдущего адреса и присваивания 10 этому местоположению?

1

Решение

Почему значение указателя меняется на 10 (0xa) вместо увеличения предыдущего адреса и присваивания 10 этому местоположению?

В каком месте? Такой локации не существует. p указывал на один int, а не массив ints. Указатель, полученный в результате такого приращения, не указывает на местоположение, в котором можно выполнить косвенное обращение. Попытка сделать это, поскольку этот код имеет неопределенное поведение, означает, что может произойти абсолютно все. Компилятор может делать все, что пожелает, потому что нет никаких требований относительно того, что должно произойти. Не делай этого.

В вашем конкретном эксперименте это появляется что две переменные были расположены рядом друг с другом, и при увеличении, переменная p в конечном итоге указал на себя, а затем назначил 10, что является A в шестнадцатеричном. Нет никакой гарантии, что это произойдет снова, когда вы скомпилируете с другой версией компилятора или опциями компилятора, или даже если вы внесете, казалось бы, невинные изменения в коде. Не делай этого.

4

Другие решения

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

1

увеличивая указатель на один элемент, вы фактически посещаете тот же указатель и изменяете его значение на 0xA, поскольку они расположены в памяти последовательно.

1
По вопросам рекламы [email protected]