Pointerarithmetik mit verschiedenen Typen



  • Hallo,

    ich hatte letztens so einen Fall und er hat mich ein paar Stunden gekostet... um den Fehler zu finden.

    #include <iostream>
    using namespace std;
    
    int main() {
    	char *ptr0 = (char*)42;
    	int *ptr1 = (int*)42;
    	ptr0 = ptr0 + 1;
    	ptr1 = ptr1 + 1;
    	cout << (int)ptr0 << " :: " << (int)ptr1 << endl;
    	return 0;
    }
    

    http://ideone.com/CXs4zJ

    Ich hätte erwartet, dass bei beiden das Ergebnis 43 kommt.
    Kann man für so etwas Warnungen anschalten? Wonach muss ich Googlen?

    Danke!


  • Mod

    theliquidwave schrieb:

    Wonach muss ich Googlen?

    😕 Pointerarithmetik? Dieser Effekt ist doch gerade das, was man da drunter versteht. Da gibt's auch keine Warnung für, das ist so gewollt. Sonst wären Pointer ziemlich unbenutzbar. Wieso solltest du jemals 43 als Ergebnis bei dem int* haben wollen?



  • Kann man für so etwas Warnungen anschalten?

    Das muss man wissen, das hat nichts mit Flüchtigkeitsfehlern o.ä. zu tun.

    Ich hätte erwartet, dass bei beiden das Ergebnis 43 kommt.

    Es ist definiert, dass Addition und Subtraktion bei Zeigern vom Typ T* immer in Schritten der Größe sizeof(T) geht. Also: Inkrementierst du einen Zeiger vom Typ int* , dann wird sizeof(int) Bytes auf die Adresse addiert.

    Das hat sehr gute Gründe und das sollte man in jedem guten Grundlagenbuch beigebracht bekommen.

    ~* cv-qualifizierung mal außen vor gelassen~



  • Wieso solltest du jemals 43 als Ergebnis bei dem int* haben wollen?

    Mit Betonung bei jemals. Stichwort Alignment.

    SeppJ war mal wieder schneller. Dieser §$&%!"...



  • Sone schrieb:

    Wieso solltest du jemals 43 als Ergebnis bei dem int* haben wollen?

    Mit Betonung bei jemals. Stichwort Alignment.

    Das wäre nach Standard durchaus erlaubt.



  • Danke. Unglaublich dass ich schon so lange hobbymäßig mit C/C++ "überlebt" habe ohne das zu realisieren. Wer weiß, wie viele Stunden ich schon damit rumgeeiert habe, ohne das jetzt noch zu wissen. Na super.

    Ein Buch habe ich nie gelesen... Habe immer alles learning by doing gemacht. War wohl nicht so schlau 👎


Anmelden zum Antworten