адрес=%p \nИзначальное значение=%d \n", (void*)px, *px);
px++;
printf(" \npx++ \nАдрес=%p \nЗначение=%d \n", (void*)px, *px);
px--;
printf(" \npx-- \nАдрес=%p \nЗначение=%d \n", (void*)px, *px);
Вывод программы :
`Изначальный адрес=0x7ffc5ccde80c
Изначальное значение=10
px++
Адрес=0x7ffc5ccde810
Значение=1556998160
px--
Адрес=0x7ffc5ccde80c
Значение=10`
Откуда взялось значение: 1556998160 по новому адресу? Осталось там от другой программы, использующей эту память до Си?
Могло и от твоей остаться, а может это что-то в строковом представлении, а может и нет, а может... это ub
Правильный ответ на этот вопрос — вас это не должно волновать, так делать нельзя это UB. Конкретно в данном случае 1556998160 это 0x5ccde810 — младшие 32 бита адреса переменной x. Т.е. мы попали в адрес переменной px и попробовали её разыменовать как int. В общем случае, обычные современные OS "не оставляют данные от предыдущих запусков". В неинициализированной памяти в общем случае будет мусор.
Спасибо. Понял. Надеюсь. ))
Какие биты переменной x если адресная арифметика
Значит смещение на следующий стек памяти произошло корректно и эти данные никак физически не связаны с x?
Значит это просто мусор, не принадлежащий другой программе? Мы не можем попасть на память другой программы?
Обсуждают сегодня