malloc und casten?
-
Bisher habe ich mit malloc immer so Speicher reserviert:
int *DynArray; DynArray = malloc(sizeof(int)*10); // Platz für zehn Integer Werte
ist es sinnvoll hier den Zeiger, den man von malloc bekommt zu casten?
int *DynArray; DynArray = (int*)malloc(sizeof(int)*10); // Platz für zehn Integer Werte
was kann passiern wenn ich nicht caste?
-
Vertexwahn schrieb:
ist es sinnvoll hier den Zeiger, den man von malloc bekommt zu casten?
Nein. Das ist sinnlos (und evtl gefährlich, weil Du damit u.U. Fehler verdeckst) und nur dazu da um ordentliche C-Programme rückwärtskompatibel zu irgendwelchen veralteten Programmiersprachen wie C++ zu machen.
-
Vertexwahn schrieb:
was kann passiern wenn ich nicht caste?
nichts. In C bruchst du nicht zu casten, das tut C alleine.
-
Daniel E. schrieb:
Nein. Das ist sinnlos (und evtl gefährlich, weil Du damit u.U. Fehler verdeckst) und nur dazu da um ordentliche C-Programme rückwärtskompatibel zu irgendwelchen veralteten Programmiersprachen wie C++ zu machen.
also in C++ ist es erforderlich?
wo liegt da der Unterschied - mmh - malloc liefert einen void Pointer - dieser wird in C automatisch gecastet (wie auch immer ;)) und in C++ muss ich ihn selber casten, weil C++ einen char Zeiger nicht eine void Adresse zuweisen kann - oder wie?
-
Vertexwahn schrieb:
also in C++ ist es erforderlich?
C und C++ sind 2 verschiedene Sprachen, C mit C++ Stil zu schreiben ist genuaso schlecht als C++ mit C stil. In C braucht man nicht zu casten, in C++ schon, aber du bist im C Forum und deshalb behandeln wir nur den C Fall. Es ist falsch, wenn man sagt, alles was in C geschrieben, wird in C++ kompiliert.
Vertexwahn schrieb:
wo liegt da der Unterschied - mmh - malloc liefert einen void Pointer - dieser wird in C automatisch gecastet (wie auch immer ;)) und in C++ muss ich ihn selber casten, weil C++ einen char Zeiger nicht eine void Adresse zuweisen kann - oder wie?
siehe Antwort 1. C und C++ funktionieren anders.
-
supertux schrieb:
Vertexwahn schrieb:
was kann passiern wenn ich nicht caste?
nichts. In C bruchst du nicht zu casten, das tut C alleine.
und wenn man's trotzdem macht stört's auch nicht...
-
In C braucht man nicht zu casten, in C++ schon, aber du bist im C Forum und deshalb behandeln wir nur den C Fall.
In C braucht man nicht casten? hä? kann ich mir dann generel so sachen wie
int x = 9; char y = (char)x;
sparen?
-
In C muss man natürlich auch casten. Aber nicht einen void* in einen anderen Zeiger. void* lassen sich in alles implizit umwandeln.
Und natürlich stört es, wenn man den cast bei malloc macht, weil dadurch Fehler entstehen können.
wurde schon sooft besprochen.
-
net schrieb:
supertux schrieb:
Vertexwahn schrieb:
was kann passiern wenn ich nicht caste?
nichts. In C bruchst du nicht zu casten, das tut C alleine.
und wenn man's trotzdem macht stört's auch nicht...
Aber hallo, und wie:
/* Dateianfang */ int main(void) { int *p = malloc(sizeof *p); } /* dateiende */
Das gibt beim Übersetzen eine Fehlermeldung.
/* Dateianfang */ int main(void) { int *p = (int*)malloc(sizeof *p); }
hingegen oftmals nicht. Darum ist es idR nicht sonderlich schlau, mallocs zu casten.
-
Vertexwahn schrieb:
In C braucht man nicht zu casten, in C++ schon, aber du bist im C Forum und deshalb behandeln wir nur den C Fall.
In C braucht man nicht casten? hä? kann ich mir dann generel so sachen wie
int x = 9; char y = (char)x;
sparen?
ja, das kannst du, wobei bei deinem Code ist es egal, ob du
int x = 9; char y = (char)x;
oder
int x = 9; char y = x;
hast, y speicher den ASCII Code 9 und nicht '0'+9 (meistens 57)
-
Daniel E. schrieb:
/* Dateianfang */ int main(void) { int *p = malloc(sizeof *p); } /* dateiende */
Das gibt beim Übersetzen eine Fehlermeldung.
das stimmt gar nicht. Ein C Compiler bringt da nicht mal eine Warnung.
-
supertux schrieb:
Ein C Compiler bringt da nicht mal eine Warnung.
sollte er aber, weil int nach int* keine alltägliche konvertierung ist
-
und wieso sagst du
Aber nicht einen void* in einen anderen Zeiger. void* lassen sich in alles implizit umwandeln.
-
supertux schrieb:
und wieso sagst du
Wenn es keinen Prototypen für eine Funktion gibt, dann wird int als rückgabetyp angenommen.
sprich: der Compiler kennt malloc nicht, nimmt also folgenden prototypen an:
malloc();
was ja gleichbedeutend mit
int malloc();
ist
-
Shade Of Mine schrieb:
supertux schrieb:
und wieso sagst du
Wenn es keinen Prototypen für eine Funktion gibt, dann wird int als rückgabetyp angenommen.
sprich: der Compiler kennt malloc nicht, nimmt also folgenden prototypen an:
malloc();
was ja gleichbedeutend mit
int malloc();
istboah shit, du hast Recht, ich hab darauf nicht geachtet, dass dort kein #include <stdlib.h> stand. Wenn das so ist, dann nehme ich meine Komentare zurück. Klar, ohne stdlib.h bekomme ich 2 Warnungen.
@Daniel: sorry, hab nicht ganz aufgepasst.
-
Vertexwahn schrieb:
Daniel E. schrieb:
Nein. Das ist sinnlos (und evtl gefährlich, weil Du damit u.U. Fehler verdeckst) und nur dazu da um ordentliche C-Programme rückwärtskompatibel zu irgendwelchen veralteten Programmiersprachen wie C++ zu machen.
also in C++ ist es erforderlich?
Nein, ist es nicht, da man in C++ kein malloc, sondern new verwendet.
-
groovemaster schrieb:
Nein, ist es nicht, da man in C++ kein malloc, sondern new verwendet.
[klugscheißen]Im Falle void* malloc(size_t) hast du Recht, aber nicht im Allgemeinen mit void* Funktionen.[/klugscheißen]
-
supertux schrieb:
groovemaster schrieb:
Nein, ist es nicht, da man in C++ kein malloc, sondern new verwendet.
[klugscheißen]Im Falle void* malloc(size_t) hast du Recht, aber nicht im Allgemeinen mit void* Funktionen.[/klugscheißen]
Ist wie ein Witz, wo ich die Pointe nicht begreife. Sie quälen mich wie Blähungen beim Lauschen im Kammerkonzert.
Mag mich ein Klugscheißertagsetzer aufklären, wo der Gimmick lag?
-
pointercrash() schrieb:
Mag mich ein Klugscheißertagsetzer aufklären, wo der Gimmick lag?
In C brauchst du (void*) in einen anderen Pointer nicht zu casten. D.h, wenn du hast void* foo(); dann kann man so machen: int *x = foo(); oder char* x=foo(); us, d.h. void* Pointer lassen sich in alles implizit umwandeln. In C++ ist dies nicht der Fall, wäre void* foo() eine C++ Funktion, so müsste
int* x = (int*) foo(); // oder char* x = (char*) foo();
Vertexwahn hat aber gesagt "also in C++ ist es erforderlich?" und hat sich eher auf auf die Ausgabe von malloc bezieht. Nur malloc sollte man mit C++ nicht benutzen, dafür gibt es den new Operator. Alles klar?
-
Aah - ja, jetzt klar
Hab' von C++ bislang die Finger gelassen, deswegen wohl mein "memory hole". Man wird auch durch's Mitlesen (hoffentlich) täglich schlauer
Danke, S-Tux