Указатель арифметики c расчет - PullRequest
0 голосов
/ 08 мая 2020
#include <iostream>

using namespace std;

class temp {
    int a = 10;
};

class derived : temp {
    int b = 20;
};

int main()
{
    derived der;
    void * p = &der;
    cout<<"First element in der is : "<<*(int*)p<<endl;
    cout<<"(int*)p :"<<(int*)p<<endl;
    p += sizeof(int); //Way -1
    //p = (int*)p + sizeof(int); //Way-2
    cout<<"Second element in der is : "<<*(int*)p<<endl;
    cout<<"(int*)p :"<<(int*)p<<endl;

    return 0;
}

Если я выполню приведенный выше код, я получу следующий результат:

Первый элемент в der: 10
(int *) p: 0x7ffe9f05a928
Второй элемент в der: 20
(int *) p: 0x7ffe9f05a92 c

Где, как если бы я комментировал строку кода в (Way-1) и строку без комментариев для (Way-2), я получаю результат ниже :

Первый элемент в der: 10
(int *) p: 0x7ffc10e6de18
Второй элемент в der: 0
(int *) p: 0x7ffc10e6de28

Что не так во второй попытке? Почему здесь разные результаты арифметики указателя c?

1 Ответ

1 голос
/ 08 мая 2020

Когда вы делаете это:

void * p = &der;
int i = *(int*)p;

вы (косвенно) приводите указатель derived к указателю int. Это вызывает неопределенное поведение, и программа может печатать что угодно. Он даже может распечатать разные результаты при повторном запуске.

...