Zeiger auf Zeiger bei Funktionen ??
-
Hallo erstmal,
Ich möchte eine Funktion schreiben, die mir die malloc-Funktion durchführt.
Da aber die Malloc-Funktion einen Zeiger braucht und man ja einen Zeiger meiner Funktion übergeben muss, funktioniert mein Ansatz dabei nicht.arbeite mit Borland C++ Builder 6 Enterprise und es handelt sich um eine Konsole.
Hier mal mein Quellcode:
#include <stdio.h> #include <conio.h> #include <stdlib.h> char *Name; char *zgr; int GetSpace(char *gsVar, int gsSize); int main(void) { int x; x = GetSpace(Name, 20); printf("%d\n", Name); // um die Zieladresse anzuzeigen getch(); //warten bis Taste gedrückt wurde return 0; } int GetSpace(char *gsVar, int gsSize) { int gsRet; if ((*gsVar = (char *) malloc(gsSize)) == NULL) { printf("\n\n################################\n"); printf("# Fehler bei Speicherzuweisung #"); printf("\n################################\n\n"); gsRet = 0; } else { gsRet = 1; } printf("## %d ##\n", gsVar); return gsRet; }
Fehlermeldung: Konvertierung von (char nach (char) nicht möglich.
heimschmiede
-
Sagt die Fehlermeldung nicht schon alles?
mit *gsVar dereferenzierst du den Zeiger gsVar, du erhälst also einen char. In einen char kannst du aber keinen Zeiger reinpacken. Deswegen beschwert sich der Compiler.
Lösung: Mach das * vor gsVar und das (char*) vor malloc weg. Letzteres ist zwar kein Fehler, aber überflüssig.
-
Achso, du wolltest Zeiger auf Zeiger programmieren.
In diesem Fall reicht es, wenn du vor gsVar im Funktionskopf zwei anstatt einem Sternchen schreibst. Beim Aufrufen der Funktion musst du die Adresse des Zeigers übergeben. Also nicht Name, sondern &Name schreiben.Trotzdem gilt: (char*) vor malloc ist überflüssig.
p.s.:
Warum ist Name eigentlich global? Hat das irgendeinen zwingenden Grund?
-
Danke für deinen Tipp, hat mir weitergeholfen.
Ich programiere erst seit 2-3 wochen mit c und komme aus der Visual Basic Welt und in VB arbeite ich am liebsten mit globalen Variablen, weil sie ja nie die Gültigkeit verlieren und alle Vars, die für das prog am wichtigsten sind deklarier ich immer global.
Zu dem (char vor malloc: Der Compiler beschwert sich immer, wenn ichs weglasse.
"Kovertierung von (void nach (char nicht möglich"heimschmiede
-
Auch wenns für einen VB-Umsteiger schwer fällt: Gewöhn dir an möglichst wenig globale Variablen zu verwenden. Der Code wird dadurch viel lesbarer.
Heimschmiede schrieb:
Zu dem (char vor malloc: Der Compiler beschwert sich immer, wenn ichs weglasse.
"Kovertierung von (void nach (char nicht möglich"In C++ braucht man das (char*). In C aber nicht.
Folglich hast du eine .cpp-Datei erstellt und keine .c-Datei. Oder du hast einen C++ Compiler laufen, der immer im "C++ Modus" kompiliert.
-
Also wenn man C++ programmiert dann sollte man sowieso malloc meiden, da der Cast eines Rückgabewertes von malloc sehr unsauber ist.
-
Was benutzt ihr/man , wenn man einen String erstellt, ohne vorher zu wissen, wie lang der werden wird ??
Ein großes Array verschwendet meines herachtens zu viel Rescourcen.heimschmiede
-
Du programmierst in C, deswegen ist malloc voll in Ordnung.
In C++ würde ich std::string benutzen. Diese Klasse befreit dich von allen Speichersorgen.
Ansonsten: vector, list, oder direkt mit new und delete. Grob gesagt entspricht new malloc und delete free.