Was passiert wenn man einem Array 2 Größen hintereinander zuweist?

... komplette Frage anzeigen

3 Antworten

Du musst prinzipiell unterscheiden zwischen einem Objekt (hinter dem tatsächlich Speicherplatz steckt), einer Referenz (das ist ein Zeiger auf ein Objekt) und einer Variable (die einen Zeiger auf ein Objekt hält).

(bei Sprachen wie C/C++ gibt es eine weitere Möglichkeit, dem Speicher des Objekts direkt in der Variable zu halten, aber das ignoriere ich hier mal)

Nach der Deklaration der Variablen, mit:

int foo[];
int bar[];

sind in "foo" und "bar" zunächst mal Variablen, die eine Referenz auf ein Objekt halten können, es aber noch nicht tun.
Sie werden vorbelegt mit null-Pointer; also einen ungültigen Zeiger auf nichts. Greift man darüber zu ("foo.size()") erhält man eine null-pointer exception, womit Dir das System sagen will: "das Programm versucht auf ein nicht-Objekt zuzgreifen".

Mit "new" wird Speicher für ein Objekt alloziert, und eine Referenz (=Zeiger darauf) geliefert. Nach der Zuweisung:

foo = new int[10];

liegt in "foo" eine Referenz auf einen int-Array mit Platz für 10 Elemente.
Das Objekt "lebt" weiter, solange eine Referenz darauf besteht. Man kann z.B. die Referenz als Funktionsargument übergeben, oder auch einer anderen Variablen zuweisen. Nach:

bar = foo;

zeigen sowohl "foo" als auch "bar" auf das selbe Objekt.
Und nach:

foo = NULL;

zeigt "foo" wieder auf nichts, "bar" aber immer noch auf den Array.

Übrigens, um Schreibarbeit sparen kann, ist es möglich, die Allozierung des Objekts gleich hinter die Deklaraion zu schreiben ("int foo[] = new foo[10];"). Ist aber technisch das selbe wie oben.

Nun sollte klar sein, was folgender Code macht:

int foo[];

foo = new int[3];
foo = new int[5];

es wird zuerst ein 3-Elementearray alloziert, und ein Zeiger darauf in "foo" abgelegt. Dann ein weiterer Array (mit 5 Elementen) alloziert, und in "foo" abgelegt.
Das urspr. 3-Element Array wird "vergessen", weil keine Referenz darauf mehr existiert (es sei denn, Dein Programm merkt sich die Referenz woanders, indem Du zwischen die 2 Anweisungen Code dazu einfügst).

Objekte existieren unabhängig davon, ob es eine Variable gibt. Z.B. kann man schreiben:

this.func( new int[10] );

Hier wird eine Funktion aufgerufen, und eine Referenz (Zeiger) auf einen frisch allozierter Array als Argument übergeben.

Das automatische Finden, ob Dein Programm noch irgendwo eine Referenz auf ein Objekt hat, nennt man "automatische Speicherverwaltung", oder auch "Garbage Collection". Du muss Dich in höheren Programmiersprachen nicht darum kümmern (in C/C++ aber schon). Im Hintergrund werden ncht mehr referenzierte Objekte wieder freigegeben, und wiederverwendet, so daß der Speicherbedarf nicht ewig wächst.

Hoffe alle Klarheit beseitigt zu haben ;-D

PS: manchmal ist es sinnvoll, ein Bildchen mit Kästchen (Objekte) und Pfeilen (Zeiger) aufzumalen.

foo
+--------+
|      *---------------> +--------+
+--------+ | |
| |
+--------+
bar
+--------+
|      *---------------> +--------+
+--------+ | |

Am Anfang wird a als leeres Array deklariert.

ín der zweiten Zeile wird a dann ein Array mit der größe 3 zugwiesen und in der dritten Zeile wird a dann ein Array mit der größe 5 zugewiesen.

Das Array wird aber nicht von 3 auf 5 Elemente erweitert sondern es wird ein komplett neues Array erschaffen das nichts mit dem vorherigen zu tun hat, weder Werte noch Speicherbereiche

Kommentar von RaibowD
05.01.2016, 13:58

Danke, wollte nur nochmal auf Nummer sicher gehen :)

0
Kommentar von Schachpapa
05.01.2016, 14:30

Am Anfang wird nur eine Referenz für ein Array deklariert. Da steckt noch kein Objekt dahinter. a.length würde eine Null-Pointer Exception erzeugen.

Ich bevorzuge übrigens die Schreibweise für eine Referenz auf ein Array von int (Geht aber beides, int a[] ist die in C verwendete)

int[] a;
0

kannst ja mal ausprobieren. lass dir einfach die ID (also die ID von dem Object) geben. 

einmal vom dem 3 und dann dem vom 5, dann siehst du es

Was möchtest Du wissen?