Verständnisfrage Speicheradresse Arrays



  • beschäftige mich grad mit Arrays und hab so ein kleines Beispielprogramm geschrieben. Wie Arrays funktionieren ist mir glaub ich jetzt klar. Nur eins versteh ich jetzt nicht. Ih habe ein Integer-Array erstellt und die Adressen mit ausgegeben. Danach hab ich ein double-array erstellt. Warum beginnen die Elemente wieder mit der gleichen Adresse?

    #include "stdafx.h"
    
    using namespace std;
    #define SIZE 10
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int iarray[SIZE] = {0,1,2,3,4,5,6,7}; // Elemente definiert und initialisiert
    	iarray[0] = 100;      // weist dem ersten Element den Wert 100 zu
    	iarray[1] = 44;
    	iarray[2] = 1645;
    
    	for (int i=0; i<SIZE; i++) {
    		cout << "Index " << setw(2) << i  << " Wert: " << setw(10) << iarray[i] << " Adresse: " << &iarray[i] 
    			<< " Groesse: " << sizeof(iarray[i]) << " Bytes" << endl;
    	}
    	cout << endl;
    	cout << "Groesse des ges. Arrays: " << sizeof(iarray) << endl;
    	int groesse = sizeof(iarray)/sizeof(int);
    	cout << "Anzahl der Elemente    : " << groesse << endl;
    	cout << "erste Adresse          : " << &iarray << endl;
    	cout << endl;
    
    	double darray[] = {2.1,6.2,7.8};
    	groesse = sizeof(darray)/sizeof(double);
    	for (int i=0; i<groesse; i++) {
    		cout << "Index " << setw(2) << i  << " Wert: " << setw(10) << darray[i] << " Adresse: " << &iarray[i] 
    			<< " Groesse: " << sizeof(darray[i]) << " Bytes" << endl;;
    	}
    
    	return 0;
    }
    


  • Copy/Paste ist böse!
    Schau dir mal genau an, was du da für eine Adresse ausgibst. 😉



  • Hast Dich beim Copy+Paste vertan.



  • oh^^ sorry.
    was so ein kleines 'd' so ausmachen kann.

    aber prinzipiell werden die Daten hintereinanderim Stack abgelegt oder? und die Adressen je nach Variablengröße erhöht? Wann werden die Speicher wieder gelöscht?



  • Freigegeben wird der Speicher im Grunde wenn du den Scope verläßt, in diesem Fall die main-Methode. Dadurch wird aber auch dein Programm beendet, was eh den Speicher freigibt.
    Neue Scopes erstellst du zB mit Funkionen, innerhalb von Schleifen oder auch mit simplen geschweiften Klammern.



  • das Wort scope ist neu für mich



  • rudpower schrieb:

    aber prinzipiell werden die Daten hintereinanderim Stack abgelegt oder? und die Adressen je nach Variablengröße erhöht? Wann werden die Speicher wieder gelöscht?

    Ja. Gelöscht, respektive freigegeben wird der Speicher wieder (bei automatischen Objekten, also die, die du ohne new/malloc erstellst) wenn du den aktuellen Scope (Bereich) verlässt. Das heisst z.B wenn du eine lokale Variable in einer Funktion hast, sobald die Funktion verlassen wird. Wenn du einen Member in einer Klasse hast sobald die Klasse selbst (oder besser das Objekt) zerstört wird. Man kann das auch ganz von selbst fein steuern, indem man { und } benutzt. Bsp:

    class bar
    {
     private:
      int m_;
    };
    
    int foo ()
    {
     int n = 5;
    
     {
       int f = 2;
     } // f wird hier zerstört
    
    } // n wird hier zerstört
    
    int main ()
    {
     foo ();
    
     bar b;
    } // b wird hier zerstört und mit ihm auch die member m_
    

    Wenn du aber z.B eine static Variable hast, dann wird diese erst wenn die main beendet wird zerestört. (egal, wo du sie erzeugt hast).
    Im Falle von dynamischen Speicher, den du mit new anfordern kannst geht die Lebensdauer solange bist du sie mit delete aufhebst. (oder bei modernen Betriebssystemen, wenn dein Programm selbst beendet wird).

    /EDIT
    Ein Scope ist, wie schon gesagt ein Bereich. Am besten schaust du dir die Beispiele an, die sehr genau besagen, was ein Scope ist. 😉
    Die Übersetzung auf Deutsch passt sogar anscheinend recht gut:
    http://www.dict.cc/englisch-deutsch/scope.html
    Bis auf Oszilloskop können imo alle Möglichkeiten als Synonyme betrachtet werden. 🙂



  • alles klar, danke für die Hilfe.


Anmelden zum Antworten