malloc in C

nairolf
Erstie
Erstie
Beiträge: 18
Registriert: 31. Jul 2011 13:58

malloc in C

Beitrag von nairolf »

Hallo,

Auf dem Übungsblatt 4 in Aufgabe 2 sollen wir ja ein Array erstellen, das so groß ist, wie die Benutzereingabe über der Konsole.
da wir das mit malloc machen sollen, wollte ich mal fragen, ob mir vielleicht einer nochmal die folgenden Zeilen erklären könnte (Vorlesungsfolie S.47)

Code: Alles auswählen

1. int n = 10; // Anzahl von Elementen
2. char *array; // Array fuer den allokiert wird
3. array = (char*)malloc(n); // fordert 10 Bytes an. der Cast ist
4. // noetig, da malloc void* liefert
was mir hier noch nicht ganz klar ist, ist zB. der Stern in Zeile 2 vor "array".
und was darf man genau unter "der Cast ist noetig, da malloc void* liefert" verstehen?

Könnte man bei der Aufgabe (wenn hier nicht nach malloc verlangt worden wäre) einfach auch folgendes schreiben:
int eingabe;
scanf("%d", &eingabe);
int array[eingabe];
?

dschneid
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 271
Registriert: 14. Dez 2009 00:56

Re: malloc in C

Beitrag von dschneid »

char *array bedeutet, dass die Variable array vom Typ char* (d.h. Pointer auf char) ist. Arrays gibt es in C nicht als komplette Objekte, wie etwa in Java; sie sind nichts weiter als zusammenhängende Speicherbereiche, und werden in einer Zeigervariable gespeichert, die auf ihre erste Position im Speicher zeigt.

void* ist ein besonderer Typ, den man wörtlich als "Zeiger auf keinen Datentyp" auffassen kann (in dem Sinne wie void bei Funktionen angibt, dass das Resultat keinen Datentyp hat), also quasi ein Zeiger auf unstrukturierten Speicher. Das besondere daran ist, dass man Variablen vom Typ void* nicht dereferenzieren kann (man kann also nicht nachsehen, worauf gezeigt wird), weil bspw. nicht bekannt ist, wie groß die Daten, die dort liegen, überhaupt sind, oder wie man mit ihnen umgehen könnte (das weiß man ja nur, wenn man den Datentyp kennt).

Wieso macht das jetzt Sinn? malloc stellt ja tatsächlich nur einen vorerst unstrukturierten Speicherbereich bereit, deswegen hat es den Rückgabetyp void*. Bevor wir den Speicher aber dereferenzieren können, um etwas hineinzuspeichern, müssen wir den von malloc übergebenen Pointer als Zeiger auf ein char-Array interpretieren, also in char* casten. Dann können wir das Array (wie gesagt eigentlich nur den Zeiger auf den Anfang des allokierten Speicherbereiches) in der Variable array vom Typ char* speichern.

Deine Variante funktioniert dagegen nicht: Man kann Arrays in C nur in der Form array[<length>] definieren, wenn die Länge zur Compile-Zeit schon feststeht, also nur wenn <length> eine Konstante ist.

Antworten

Zurück zu „Archiv“