2015-06-29 2 views
0

Рассмотрим следующий код:Поведение в случае приращения указателя. C++

int main() 
{ 
    int* p = new int(3); 
    p+=4; 
    std::cout<<*p<<std::endl; 
} 

Мой компилятор (Visual Studio 2012) печатает: -7514522142 ИНТ этот случай.
Так можем ли мы каким-то образом выводить вывод и является ли этот код законным?

+1

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

+3

Нет, и нет ..... Учитывая этот «новый» код, это не будет законным даже с 'p + = 1;' – WhozCraig

ответ

8

Вы получаете доступ к памяти (выделенной для одного объекта int) за пределами границ. Поведение undefined, то есть не выводимо. Программа не должна считаться законной, несмотря на то, что она синтаксически действительна.

4

Итак, можем ли мы каким-то образом выводить вывод и является ли этот код законным?

Указатели увеличиваются в несколько раз по размеру, на который указывают. Когда вы добавляете 4 в p, вы добавляете 4 * sizeof(int), а не только 4 байта.

Если вы пытаетесь сделать p, укажите «следующее» целое число, увеличьте его на 1, а не 4. В противном случае p будет указывать на память за пределами того, что вы выделили.

В самом деле, если я не ошибаюсь, ваше выделение только создает единый int со значением 3, а не три отдельных int S:

int* p = new int(3); 

Попробуйте закомментировать p += 4; линию, и вы должны получить «3 'как выход. Учитывая, что ответ juanchopanza выше, это место.

Смежные вопросы