Diskussion:C-Programmierung: Speicherverwaltung

Aus Wikibooks
Zur Navigation springen Zur Suche springen

<quote> In C ( anders als in C++) sollte man aber auf den cast verzichten, da dieser einen möglichen Fehler verbirgt, wenn malloc() nicht inkludiert wurde <quote>

Blabla, bitte ein Beispiel zu der Behauptung. Ich kann mir darunter NICHTS vorstellen und kann es deshalb auch nicht einsehen.

Wenn ich die stdlib.h nicht einbinde, kommt bei meinem djgpp unter Windows nur eine Warnmeldung:

<quote> malloc.c:6: warning: incompatible implicit declaration of built-in function 'malloc' </quote>

Ansonsten funktioniert die Funktion wie gewünscht.

Hintergrund ist, dass malloc mit dem Rückgabetype "void*" definiert ist. Da das Ergebnis von malloc aber einer Variable von einem anderen Datentyp zugewiesen wird, sieht der Kompiler darin eine unzulässige, implizite Neudefinition von malloc. Ist der Typ der Variable, auf die das Ergebnis von malloc geschrieben werden soll aber auch ein pointer-Datentyp, macht der Kompiler daraus eine implizite Typumwandlung (z.B. in int*, wie unten explizit im Beispiel angegeben), und wirft deshalb nur eine Warnung, keinen Fehler. Wie C++ da genau mit umgeht, weiß ich nicht, ich halte aber typenscharfes programmieren (Typen und Typumwandlungen immer explizit angeben) in den meisten Fällen für eine sehr nützliche Übung. -- Käptn Weltall 17:32, 16. Okt. 2009 (CEST)[Beantworten]



Eine Frage zu den Themen "Zeiger" und "Speicherverwaltung".Ich bin auf so eine Implementierung gestoßen:

zone = (int *) calloc(n_zones, sizeof(int));

Was bedeutet (int *)? Ist es gleichbedeutend mit:

int *zone = calloc (n_zones, sizeof(int)); ?

Wenn nicht, was bedeutet es dann? Wenn ja, wozu benutzt man diese Schreibweise?

--130.83.214.73 19:25, 8. Jul. 2008 (CEST)[Beantworten]

Ein Jahr ist vergangen, aber vielleicht interessiert es ja auch andere:
Der Datentyp ist int*, also Zeiger auf int. Die Variable heißt zone und NICHT *zone. Letzteres ist die Aufforderung, hier doch bitte den Wert zu besorgen, der im Arbeitsspeicher auf der Adresse zone steht, also eine Dereferenzierung durch den Operator *. Da Zeiger-Variablen sehr oft nur dereferenziert benutzt werden, gibt es die (Un-)Sitte unter vielen C-Programmierern, auch in der Variablen-Deklaration int *zone zu schreiben, statt int* zone, was auch praktische alle C-Kompiler schlucken. Ob irgendeine Version von ANSI-C das erlaubt, weiß ich nicht, aber man findet die Schreibweise deines Beispiels weit öfter, als die andere.
Die fragliche Code-Zeile tut folgendes: calloc wird beauftragt, doch bitte zusammenhängenden Speicher der Größe n_zones*Größe int zu reservieren, woraufhin calloc einen pointer vom Typ void* zurückgibt. Dieser wird dann in den pointer-Typ int* umgewandelt, denn ein eingeklammerter Typ-Bezeichner vor einem Ausdruck ist eine Typumwandlung. Der Zeiger vom Typ int* wird dann der (Zeiger-)Variable zone zugewiesen. Der Wert der Variable zone ist dann die Adresse des ersten Bytes des ersten Werts im soeben von calloc reservierten Speicherbereich. -- Käptn Weltall 17:13, 16. Okt. 2009 (CEST)[Beantworten]

Schwammige Erklärung[Bearbeiten]

Der Artikel erklärt ziemlich unvollständig / ungenau / schwammig. Speicherverwaltung kann man das ja gar nicht nennen. Der Artikel MUSS als unvollständig deklariert werden.

Aber bitte auch nicht zu kompliziert. Am Anfang eine kurze Zusammenfassung, damit man weiß was man programmieren kann. Im Ende kann es dann kompliziert werden.

Nur ein Vorschlag, nicht mehr und nicht weniger.