dynamische Vektoren ?

24/09/2011 - 18:48 von nomad | Report spam
Hallo,

ich versuche gerade die Sprache C zu lernen und bin an einem Punkt
angekommen an dem mir einfach das Verstàndnis fehlt!
Ich hoffe ihr könnt mir weiter helfen...

Es geht um zweidimensionale dynamische Vektoren.

In den Beispielen, ich habe die unwesentlichen Sachen gestrichen, sieht der
fiktive Code z.B so aus.

int ** p_ptr;

/* Speicher für die Zeilen */
p_ptr = malloc(3 * sizeof(int));

/* die Spalten */
for( i=0; i < 3; i++) {

p_ptr[i] = malloc( 4 * sizeof(int));
}

Würde das wirklich gerne verstehen: malloc reserviert Speicher und liefert
einen Zeiger auf das erste int Element, dieser Zeiger wird in p_ptr
gespeichert.
In der Schleife werden jetzt für jede Zeile weitere Blöcke reserviert und
malloc liefert wieder jeweils einen Zeiger auf das erste Element.
Meine Frage ist nun wo werden diese Zeiger gespeichert ? *(p_ptr + i) sind
doch die int Elemente ...

Gruss Marco
 

Lesen sie die antworten

#1 Markus Wichmann
25/09/2011 - 00:05 | Warnen spam
On 24.09.2011 18:48, nomad wrote:
Hallo,

ich versuche gerade die Sprache C zu lernen und bin an einem Punkt
angekommen an dem mir einfach das Verstàndnis fehlt!
Ich hoffe ihr könnt mir weiter helfen...

Es geht um zweidimensionale dynamische Vektoren.

In den Beispielen, ich habe die unwesentlichen Sachen gestrichen, sieht der
fiktive Code z.B so aus.

int ** p_ptr;

/* Speicher für die Zeilen */
p_ptr = malloc(3 * sizeof(int));




Das soll vermutlich eher heißen:

p_ptr = malloc(3 * sizeof (int*));

/* die Spalten */
for( i=0; i < 3; i++) {

p_ptr[i] = malloc( 4 * sizeof(int));
}

Würde das wirklich gerne verstehen: malloc reserviert Speicher und liefert
einen Zeiger auf das erste int Element, dieser Zeiger wird in p_ptr
gespeichert.
In der Schleife werden jetzt für jede Zeile weitere Blöcke reserviert und
malloc liefert wieder jeweils einen Zeiger auf das erste Element.
Meine Frage ist nun wo werden diese Zeiger gespeichert ? *(p_ptr + i) sind
doch die int Elemente ...




Nein, eben nicht. p_ptr ist ein pointer to pointer to int. Oder auch ein
dynamisches Array von int-Zeigern. Zum allozieren musst du also die
Größe von int-Zeigern als Grundlage nehmen.

Jedes Element von p_ptr ist ein pointer to int. Also ein dynamisches
Array von int.

Übrigens ist "*(p_ptr + i)" eine ziemlich seltsame Notation für p_ptr[i].

Du kannst es dir da ganz einfach machen: p_ptr hat doch in der
Deklaration zwei Sterne. Jedes "[]" und jedes "*" macht einen wieder
weg. Und schon kennst du den Typ des Ausdrucks.

Gruss Marco



HTH,
Markus

Ähnliche fragen