Gefahren durch Pointer ?
-
Original erstellt von Bashar:
in C++ mußt du den Rückgabewert von malloc casten.hi,
dazu 3 fragen:
- warum in c++ casten, in c nicht ?
- ist die <stdlib.h> / malloc() nicht bei beiden gleich ?
- was ist der hintergrund ? worin unterscheidet sich da c von c++ ?
-
- warum in c++ casten, in c nicht ?
a) weil die implizite umwandlung void* -> Foo* in C++ als gefährlich angesehen wird
b) weil man Funktionen nicht ohne Prototyp aufrufen kann, so dass niemals eine Umwandlung int -> Foo* verdeckt wird- ist die <stdlib.h> / malloc() nicht bei beiden gleich ?
nein, natürlich nicht
- was ist der hintergrund ? worin unterscheidet sich da c von c++ ?
siehe 1)
-
[QUOTE]Original erstellt von Bashar:
[QB]1) warum in c++ casten, in c nicht ?a) weil die implizite umwandlung void* -> Foo* in C++ als gefährlich angesehen wird
b) weil man Funktionen nicht ohne Prototyp aufrufen kann, so dass niemals eine Umwandlung int -> Foo* verdeckt wirdkannst du das nochmal anderst erklären. wo liegt der unterschied genau ? und meintest du bei a) nicht zufälligerweise C statt C++ ?
-
nochmal void* nach foo* ist in C 'normal' - dh man verwendet es öfters.
es geht ohne castbei malloc ist das problem, dass wenn man die stdlib.h nicht einbindet der compiler glaubt, dass malloc int returned
und int nach foo* ist NIE gut
in C++ (und auch C99) muss eine funktion aber deklariert sein bevor du sie verwenden kannst. du kannst also stdlib.h nicht vergessen einzubinden denn dann meldet der compiler einen fehler!
-
bei malloc ist das problem, dass wenn man die stdlib.h nicht einbindet der compiler glaubt, dass malloc int returned
und warum ?
und warum lässt sich sowas überhaupt ohne prototyp kompilieren?
-
Original erstellt von <new>:
**und warum ?und warum lässt sich sowas überhaupt ohne prototyp kompilieren? **
in C (vor C99) braucht eine funktion keinen prototypen.
wenn der compiler einen funktionsaufruf entdeckt hat, zu dem er keinen prototypen hat, dann nimmt er an, dass die funktion folgende signatur hat:int function();
warum das so ist, solltest du kernighan und ritchie fragen - es ist halt so.
in C99 ist ein prototyp aber zwingend, genau wie in C++
-
int function();
aber dann wäre ja sowas wie malloc garnicht möglich.
das hätte doch dann int malloc(int) ?
-
du könntest ja ein byte speicher reservieren:
z1=(unsigned char malloc(1);
und den zeiger dann auf word casten:
z2=(unsigned short int *)z1;
wenn du dann versuchst auch nur ein element mit dem neuen zeiger zu lesen:
a=*z2;
müsstest du eine access-violation kriegen weil du auf ein byte zuviel zugreifst.
alles natürlich sehr fiktiv, aber wenn du grosse array-felder mit malloc durchwanderst und dann mit einem grösseren variablenzeiger als mit malloc angelegt in diesem feld liesst bzw. schreibst kann es vorkommen das du gegen mitte diese access-violations kriegst weil du durch den neuen zeiger (beispiel byte auf word) den reservierten speicherbereich nur noch zur hälfte durchsuchen musst um alles abzudecken.
[ Dieser Beitrag wurde am 28.05.2003 um 13:13 Uhr von tenim editiert. ]
-
Original erstellt von <maus>:
**aber dann wäre ja sowas wie malloc garnicht möglich.das hätte doch dann int malloc(int) ?**
ne, denn
() bedeutet in C - beliebige Anzahl an Parametern, etwa wie (...)in C++ bedeutet () void, also () == (void)
-
Nicht, dass du mir anfangen zu heulen tust :p :p :p :p :p
-
Original erstellt von Shade Of Mine:
() bedeutet in C - beliebige Anzahl an Parametern, etwa wie (...)Wie würde man auf diese denn zugreifen?
-
Original erstellt von <Sydney>:
Wie würde man auf diese denn zugreifen?garnicht, denn () steht nur bei der deklaration - bei der definition muss man dann natuerlich schon mehr infos angeben.