malloc Allozierung geht verloren
-
Hallo zusammen,
für folgendes habe ich keine Antwort:
Innerhalb einer Funktion alloziere ich Speicher für Array, dass N Strukturen aufnehmen soll. Diese fülle ich. Am Ende der Funktion sind diese auch noch verfügbar. Über einen Pointer möchte ich dieses array auch a0ßerhalb de Funktion nutzen. Jedoch nach Verlassen der Funktion ist dieses array nicht mehr verfügbar.
Folgendes Beispiel zeigt was ich tue. Der Speicher wird in der Funktion NICHT durch free() freigegben
struct tim { int a; int b; }; void fun(tim* t) { //... t = (tim*)malloc(sizeof(tim)*N) // FÜLLEN // HIER komplett verfügbar } void main() { tim * r; fun(r); // r nicht mehr verfügbar!!! }Danke für Eure Hilfe!
Peter
-
edit: Ach, habe übersehen, dass du den Pointer als Kopie übergeben hast. Vergiss was hier stand.
-
Das liegt daran das der Pointer kopiert wird und dann nur der Kopie der Speicherbereich zugewiesen wird. Am ende der Methode wird die Kopie gelöscht und damit auch der Verweis auf deinen Speicher.
Probier mal das:
struct tim { int a; int b; }; void fun(tim** t) { //... *t = (tim*)malloc(sizeof(tim)*N) // FÜLLEN // HIER komplett verfügbar } void main() { tim * r; fun(&r); // r nicht mehr verfügbar!!! }Viele Grüße
Andreas
-
Du kannst eine Referenz auf den Zeiger übergeben, damit dieser geändert wird:
void fun(tim*& t)Ebenfalls geht ein Zeiger auf einen Zeiger, wobei du dann die Zugriffssyntax ändern musst (eine zusätzliche Dereferenzierung).
void fun(tim** t)Übrigens muss die
main()-Funktion sowohl in C als auch in C++ den Rückgabetypintund nichtvoidhaben.
-
Doppelter Zeiger war die Lösung.
Wenn ich kein Betriebssystem habe, darf main auch void sein

Danke Euch!
Grüße,
Peter
-
haller.peter schrieb:
Wenn ich kein Betriebssystem habe, darf main auch void sein

Nein, darf es nicht. Auch dann muss es int sein.
-
Was hat dann der Rückgabewert für einen Sinn?
-
haller.peter schrieb:
Was hat dann der Rückgabewert für einen Sinn?
Es ist im Standard so definiert, damit das Betriebssystem über den Status des Programms bescheid weiß. Ja, man geht tatsächlich davon aus, dass es ein Betriebssystem gibt! Unglaublich, oder?

-
Es gibt aber auch Systeme, die ohne Betriebssystem laufen, z.B. einige Microcontroller. Da macht der Rückgabewert keinen Sinn. Oder?
-
wenn man void macht, geht was kapudd?
-
nein, natürlich nciht
-
Doch, der Computer kann explodieren.
-
waslos schrieb:
wenn man void macht, geht was kapudd?
Ja, das ganze kompiliert nämlich nicht.
-
haller.peter schrieb:
Es gibt aber auch Systeme, die ohne Betriebssystem laufen, z.B. einige Microcontroller. Da macht der Rückgabewert keinen Sinn. Oder?
Sinn machen kann es so und so nicht - wenn überhaupt kann es Sinn ergeben

-
Athar schrieb:
Ja, das ganze kompiliert nämlich nicht.
Bei mir schon.
Und ja, es kann was kaputt gehen! Die Gatter können durchbrennen

-
Seriously schrieb:
Athar schrieb:
Ja, das ganze kompiliert nämlich nicht.
Bei mir schon.
Und ja, es kann was kaputt gehen! Die Gatter können durchbrennen

Das einzige, was hier kaputt geht, ist die Geduld der Forumsteilnehmer

-
unskilled schrieb:
Sinn machen kann es so und so nicht - wenn überhaupt kann es Sinn ergeben

Blödsinn. Seit ich von Lessing (18. Jahrhundert) diese Formulierung gesehen habe, glaube ich nicht mehr an das Märchen vom neuen bösen Anglizismus.
-
Wie dem auch sei, im C++-Standard ist explizit festgehalten, dass main einen int zurückgeben muss.
ISO/IEC 14882:2003 3.6.1 (2) schrieb:
An implementation shall not predefine the main function. This function shall not be overloaded. It shall have a return type of type int, but otherwise its type is implementation-defined. All implementations shall allow both of the following definitions of main:
int main() { /* ... */ }and
int main(int argc, char* argv[]) { /* ... */ }(... es folgt eine Beschreibung von argc und argv ...)
Von Rechts wegen darf ein C++-Compiler "void main" nicht akzeptieren.
-
seldon schrieb:
Wie dem auch sei, im C++-Standard ist explizit festgehalten, dass main einen int zurückgeben muss.
ISO/IEC 14882:2003 3.6.1 (2) schrieb:
An implementation shall not predefine the main function. This function shall not be overloaded. It shall have a return type of type int, but otherwise its type is implementation-defined. All implementations shall allow both of the following definitions of main:
int main() { /* ... */ }and
int main(int argc, char* argv[]) { /* ... */ }(... es folgt eine Beschreibung von argc und argv ...)
Von Rechts wegen darf ein C++-Compiler "void main" nicht akzeptieren.
Ich kann nicht so gut Englisch. aber sagt "but otherwise its type is implementation-defined" nicht genau das Gegenteil, also daß sehr wohl anderes gemacht werden darf, aber dann die Sache halt implementation-defined wird?
Also kein absolutes void-Verbot mehr und kein Kreuzzug und keine Heilige Inquisition, wenn das jemand geschrieben hat?
-
Frage: Warum in C++ malloc und nicht new?
Zu
int main() { /* ... */ }ist das ja in einigen Compilern so umgesetzt, das das normalerweise folgende:
returnentfallen kann, da der Compiler in dem Fall weiss was er machen sollte.
Dann steht alle Implementationen sollten folgendem Muster folgen:
int main() { /* ... */ }So weit meine recht freie Interpretation

Wie schrieb Volkard: Komma können Leben retten

MfG f.-th.