(void **) &ppval

04/09/2007 - 16:48 von Oliver Block | Report spam
Hin und wieder liest man, daß einer Funktion, die ein Argument vom Typ
void **, folgendes übergeben wird:

mystruct **ppval;

myfunc((void **)&ppval, ...);

Was mir dabei nicht einleuchtet ist, daß vor ppval bereits ** steht.
Welchen Zweck erfüllt als das & vor ppval? Wann benutzt man so etwas,
und was passiert, wenn man stattdessen

myfunc((void **)ppval, ...);

übergibt?

Gruß,

Oliver Block
 

Lesen sie die antworten

#1 Harald Luessen
04/09/2007 - 19:11 | Warnen spam
On Tue, 04 Sep 2007 Oliver Block wrote:

Hin und wieder liest man, daß einer Funktion, die ein Argument vom Typ
void ** [hat], folgendes übergeben wird:

mystruct **ppval;

myfunc((void **)&ppval, ...);

Was mir dabei nicht einleuchtet ist, daß vor ppval bereits ** steht.
Welchen Zweck erfüllt als das & vor ppval? Wann benutzt man so etwas,
und was passiert, wenn man stattdessen

myfunc((void **)ppval, ...);

übergibt?



(Bitte fixed font zum Lesen.)

Außerhalb von myfunc() ist ppval ein
Pointer auf einen Pointer auf mystruct.
(mystruct) <-- ( ) <-- (ppval)

Beim Aufruf von myfunc() übergibt man davon die Adresse, also
(mystruct) <-- ( ) <-- (ppval) <-- (&ppval)
Innerhalb von myfunc() sieht ppval so aus:
(void) <-- ( ) <-- (ppval)

Der void-Teil wird erst mit einem weiteren frechen cast
wieder sinnvoll nutzbar. Aber man hat den Vorteil, daß man
jetzt das àußere ppval selbst veràndern kann. Es wird
schließlich nicht nur sein Wert übergeben. Man kann z.B.
schreiben: ppval = NULL; oder ppval = otherval;
Und das sieht dann hinterher außerhalb von myfunc() so aus:
(mystruct) <-- ( ) (ppval==NULL) bzw.
(mystruct) <-- ( ) (ppval==otherval) --> ( ) --> (otherstruct)
Ob das Sinn macht, kann man nur sagen, wenn man die komplizierte
Datenstruktur kennt, die so manipuliert wird.

Mit der Deklaration myfunc((void **)ppval)
wird der Wert von ppval an myfunc() übergeben, also
(mystruct) <-- ( ) <-- (ppval)
Innerhalb von myfunc() sieht ppval so aus:
(void) <-- ( ) <-- (ppval)
Und eine Änderung an ppval selbst bewirkt nach außen gar nichts.
Die Änderungen an den Dingen, auf die ppval zeigt, sind
natürlich weiterhin möglich, aber jetzt um eine Ebene verschoben.

Der Name ppval innerhalb der ersten myfunc() ist natürlich
etwas blöd, weil er etwas anderes bedeutet als außerhalb,
aber ob pppval besser wàre?

Harald

Ähnliche fragen