Gefahren durch Pointer ?



  • [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 wird

    kannst 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 cast

    bei 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) ?



  • @RTC

    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.


Anmelden zum Antworten