ich Kompilieren der folgenden mit -O0 (letzten gcc/Klirren) und beide geben Sie mir eine Antwort erwarte ich nicht.Pointer-Arithmetik vom Compiler ignoriert
#include <iostream>
struct xy{
int x,y;
};
int main()
{
xy a{1,2};
int x{1};
int y{2};
int *ptr1=&a.x;
int *ptr2=&x;
ptr1++; // I now point to a.y!
(*ptr1)++; // I now incremented a.y to 3
ptr2++; // I now point to y!
(*ptr2)++; // I now incremented y to 3
std::cout << "a.y=" << a.y << " ptr1=" << *ptr1 << '\n';
std::cout << "y= " << y << " ptr2=" << *ptr2 << '\n';
}
Ausgang:
a.y=3 ptr1=3
y= 2 ptr2=2
Also dieser Zugriff mit Zeigern auf Nicht-Klassen-Variablen vom Compiler optimiert-out wird.
ich auch versucht, die int zu markieren und * als volatiles int, aber es hat keinen Unterschied machen.
Welchen Teil des Standards fehlt mir/warum darf der Compiler dies tun?
Coliru Schnipsel unter: http://coliru.stacked-crooked.com/a/ed0757a6621c37a9
Sie können Zeigerarithmetik wie diese nicht für Elemente verwenden, die keine Elemente eines Arrays sind. Es ist undefiniertes Verhalten. – juanchopanza
@juanchopanza Sie können, aber es gibt nur so viel, was Sie mit diesem Zeiger tun können. – NathanOliver
@NathanOliver Ich sagte du kannst es nicht benutzen * so * :-) – juanchopanza