PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeiger auf void?


Bolle
26.07.2002, 11:09
Mal eine Frage, ich habe da letztens was gelesen was mich ein bischen verwirrt hat. Wie ist es möglich, dass eine Funktion einen Zeiger auf void zurückgibt? Weil, wie soll sie einen zeiger übergeben, wenn sie an für sich nichts zurückgeben soll??
:mauer: :mauer: :mauer:


xOOn
26.07.2002, 11:35
void *x ();
sowas ist selten denn dann muesste es auch
void freeX (void *z); geben. kannste mal das sample bzw die funktion der funktion beschreiben!

nicht das du sowas gesehen hast

void (*func) ();

weil das ist der prototyp einer funktion

void a ()
{
// funk. a
}

void b ()
{
// funk. b
}


void main ()
{
func x;
x = a;
x (); // es wird a ausgefuehrt
x = b;
x (); // es wird b ausgefuehrt

}

ich vermute das war es was du gesehen hast

Bolle
26.07.2002, 12:57
also, das geht dabei um den operator new.
ich schreib einfach mal die definition der methode hier rein:

void * X::operator new(size_t size)
{
new_handler globalHandler = std::set_new_handler (currenthandler);

void * memory;
try {
memory = ::operator new(size)
}
catch( std::bad_alloc) {
std::set_new:handler(globalHandler);
throw;
}

std::set_new_handler(globalHandler);

return memory;
}

wenn ihr wollt, kann ich noch den rest der hier vielleicht relevanten klasse posten

xOOn
26.07.2002, 13:31
also das ist ne klasse, und die hat nen destructor der wieder aufrauemen kann, deshalb ist das ok!

und dann ist es auch noch im operator new, was der genau macht und warum das mit dem void * zurueck gegeben wird weiss ich auswendig nicht, aber wenns dich interessiert, dann kann ich in meiner c++Bibel mal nachschauen

Jan Krüger
26.07.2002, 15:06
najo... void* ist halt ein typenlosen zeiger... malloc() gibt sicher auch void* zurück. :)
PS. komischer beispielcode ;)

Shooter
26.07.2002, 15:18
Wenn ich mich nicht irre, steht void* für einen Zeiger, der keinen speziellen Typ hat, es ist also so ne Art "allgemeiner" Zeiger.

xOOn
26.07.2002, 15:37
@Scooter
es geht darum dass man das sogut wie nie macht, weil entweder gibt man einen speicher zurueck der bereits wieder freugegben wurde oder man baut speicherlecks ein. sonderfaelle bestaetigen die regel, vorallem bei klassen kann es vorkommen

Bolle
26.07.2002, 19:04
ähm, mir is grgad was komisches aufgefallen, anstatt den smiley soll da :o stehen. :D
das was ich mich nur frage, ist was ist ein zeiger auf void. was die funktion macht is bis auf den aufruf und die rückgabe für mich klar.
hmm ich google einfach mal ein bischen, mal gucken was bei rauskommt.

StoreMaster
27.07.2002, 12:08
sowas macht man, wenn man nicht weiss welcher typ zurückgegeben wird.

Bolle
27.07.2002, 12:38
danke, so lieb ich es, kurz knappe antwort :D

xOOn
29.07.2002, 08:28
@StoreMaster

jepp aber das ist ein pointer und sowas geht nicht


char *x ()
{
char y[256];
strcpy (z, "Halli Hallo");
return y;
}


grundsaetzlich gibt man keinen zeiger zurueck!!!!!!!!!
ausnamhen klassen, ...

StoreMaster
29.07.2002, 09:54
@x00n
ist schon klar, hab mich nicht auf den rückgabewert bezogen, sondern mehr um den void pointer. mein fehler

ThreeJay
13.08.2002, 03:19
Also wie schon gesagt, ist void * ein Typenloser Zeiger. Allerdings heisst das nur, dass der Typ des Zeigers erst durch den Aufruf feststeht. Wie z.B. beim Operator new:

char *zeichen;

zeichen = new char;

Damit reserviert man einfach nur Speicher im Heap....

Bei dem Beispiel das du gepostet hast wird genau dieser Operator überladen.

Jan Krüger
13.08.2002, 04:21
Ich verstehe nicht, warum man keine Pointer zurückgibt...?
Ich habe das schon gemacht und werde es auch weiter machen. Gut, es kommt nicht häufig vor, aber kaputt machen kann man damit eigentlich auch nichts (solange man weiß, wie man mit dem Speicher umzugehen hat). :)

//edit
Verrücktes, gerade ausgedachtes Beispiel (C, unter C++ ist es witzlos):
man nehme eine selbst gebaute Lib zum Verwenden von Hashlisten. Also verketteten Listen, deren Einträge in einer Hash-Tabelle eingetragen sind. Dafür braucht man eine Funktion "getitem", die einen Namen als Parameter akzeptiert und einen Zeiger auf den Eintrag mit dem angegebenen Namen zurückliefert. Denn die Lib ist allgemein gehalten und wir kennen die Typen der Einträge nicht.

Wir sehen, unter C kann es doch schon mal vorkommen, unter C++ dagegen kommt man oft drumherum. :D

SiM
14.08.2002, 22:12
malloc und calloc geben auch einen void-pointer zurück. -> es hat immer sinn einen void-pointer zurückzugeben, (wie JaSt schon gesagt hat) wenn man nicht weiss welchen typ man benötigt.

Baegsch
16.08.2002, 05:44
he, und void * ist ansi c ;)