Verschiedene Speicherbereiche herausfinden



  • Hi,

    ich weiß, dass die Programmvariablen auf dem Speicher in verschiedenen Speicherbereichen abgelegt werden. So werden z.B. abgelegt auf dem

    Datensegment:
    -initialisierte Daten, globale Variablen, ggf Heap

    Stapelsegment:
    -lokale Variablen, Hilfsvariablen und aktuelle Parameter

    Ich wollte mir jetzt ein Programm schreiben, das mir die Speicheradressen ausgibt, an denen ich dann erkennen kann, wo auf dem Speicher die verwendeten Variablen liegen. Leider weicht das Ergebnis von meinen Erwartungen ab, denn die Adressen sind alle im selben Adressraum zu finden, anstatt in unterschiedlichen... warum? und wie müsste ich es anders machen?

    Hier der Code dazu.

    #include <stdio.h>
    
    int main (int argc, const char * argv[]) {
        // insert code here...
    
    	int const pi = 3.141863;
    
    	int x = 42;
    	int y = 31;
    	int z = 9000;
    
    	if(x == 42) {
    		for(int i=0; i < 5; i++) {
    				printf("\n%p lokale Adresse i[%d]", (void *) &i, i);
    		}
    
    		int a = 41;
    		printf("\n%p lokale Adresse a", (void *) &a);
    	}
    
    	printf("\n%p Adresse x", (void *) &x);
    	printf("\n%p Adresse y", (void *) &y);
    	printf("\n%p Adresse z", (void *) &z);
    
    	printf("\n%p Adresse pi", (void *) &pi);
    
        return 0;
    }
    

    Und die Ausgabe:

    0x7fff5fbffa8c lokale Adresse i[0]
    0x7fff5fbffa8c lokale Adresse i[1]
    0x7fff5fbffa8c lokale Adresse i[2]
    0x7fff5fbffa8c lokale Adresse i[3]
    0x7fff5fbffa8c lokale Adresse i[4]
    0x7fff5fbffa88 lokale Adresse a
    0x7fff5fbffa98 Adresse x
    0x7fff5fbffa94 Adresse y
    0x7fff5fbffa90 Adresse z
    0x7fff5fbffa9c Adresse pi
    

    Also ich hätte zumindest bei pi und x,y,z einen größeren Unterschied bei der Hexzahl erwartet....

    Liebe Grüße,
    der Große Nargus


  • Mod

    DerGroßeNargus schrieb:

    Also ich hätte zumindest bei pi und x,y,z einen größeren Unterschied bei der Hexzahl erwartet....

    Warum? Bloß weil es theoretisch andere Speicherbereiche sind, braucht dazwischen doch keine Lücke sein (kann schon sein, dass trotzdem eine Lücke ist, habe ich noch nie geguckt). Es ist ja nicht so, dass das Datensegment noch wachsen könnte. Außerdem sind deine sämtlichen Variablen auf dem Stack, daher sind sie auch direkt nacheinander. Mach mal ein malloc oder zieh die Adresse eines Wertes aus dem Datensegment, also z.B. die Adresse eines Stringliterals. Ein statisch initialisierter const int ist in C keine "echte" Konstante wie in C++!



  • Die Variablen, deren Adressen du ausgibst, sind alles lokale Variablen in der main() und leben deshalb alle auf dem Stack. Wenn du größere Unterschiede sehen willst, verwende mal static , malloc(), String-Literale oder Variablen, die außerhalb der main() definiert wurden.

    PS: Übrigens ist der Heap ein eigenständiger Speicherbereich, der nichts mit dem Datensegment zu tun hat.



  • Oh ja genau so gehts, das musste außerhalb definiert werden. Dann gibt sich ein Speicherbereich (bei mir hier):

    0x100001078 Adresse static-Variable
    

    , das ist schon sehr viel deutlicher.

    Danke!


Anmelden zum Antworten