Array größe zuweisen - Problem



  • Ich stolperte neulich über Folgendes:

    "Der Zeiger, den malloc oder calloc liefern, hat die korrekte Ausrichtung für das gewünschte Objekt, muß aber noch mit einer Umwandlungsoption in den richtigen Datentyp umgewandelt werden, zu Beispiel

    int *ip;
    ip = (int 😉 calloc(n, sizeof(int));"

    Quelle: K&R - Programmieren in C (Zweite Ausgabe)

    Wollte das nur mal anbringen und hoffe, dass mich jemand erhellen kann.



  • Mechanics schrieb:

    Das ist kein "nur" 😉

    Schon richtig, aber es hat keine Nachteile wie andere Casts die irgendwelche Kontrollen (und ggf. Warnungen) vom Compiler unterdrücken.

    Ich stolperte neulich über Folgendes: [...]

    Tatsächlich! Hier der englische Text, auch 2nd. ed.

    K&R schrieb:

    The pointer retourned by malloc or calloc has the proper alignment for the object in question, but it must be cast into the appropriate type as in

    int *ip;
    pi = (int *) calloc(n, sizeof(int));
    

    😮 😕



  • Früher, bzw. damals im letzten Jahrtausend, gab malloc einen char* zurück.

    Das war allerdings noch in den ersten Versionen von C.
    Da die zweite Ausgabe allerdings schon Ansi-C beschreibt, ist das dort ein Fehler.



  • "xyz machen nur Deppen" ist ein running Gag hier. Wie immer mit running Gags: verstehen nur Insider...

    Zu K&R und malloc() / calloc() und dem cast ihres Ergebnisses. Das wird schon in Kap. 6.5 erwähnt - als auch in 7.5.8.
    Ich habe Errata gefunden, die das korrigieren.
    Allerdings ist es mir nicht so wichtig "die richtigen offiziellen" Errata zum Buch gesucht zu haben.

    Dem OP sei noch gesagt: Die Allozierung die Du implementiert hast

    int a;
    
    printf("Wie gross soll das Array sein?: ");
    scanf("%d", &a);
    int *arr=(int *)malloc(a*sizeof(int));
    

    ist soweit korrekt. Wenn es trotzdem hakt, liegt das Problem woanders.



  • Furble Wurble schrieb:

    "xyz machen nur Deppen" ist ein running Gag hier. Wie immer mit running Gags: verstehen nur Insider...

    OK. Ich hab' das auch schon 1-2 mal hier gelesen, daher war ich mir nicht sicher.
    Ist aber irgendwie ein schlechter Running Gag, oder? Ich meine... wie du schon selbst schreibst verstehen das nur Insider, und was ein Neuling sich denkt wenn man ihm das schreibt kann man sich ja denken.

    Aber egal, hat sich erledigt - hab mir ne PS4 gekauft!



  • Wutz schrieb:

    Nur Deppen benutzen VLA.

    Das glaube ich nicht, Tim.



  • DirkB schrieb:

    Früher, bzw. damals im letzten Jahrtausend, gab malloc einen char* zurück.

    Das war allerdings noch in den ersten Versionen von C.
    Da die zweite Ausgabe allerdings schon Ansi-C beschreibt, ist das dort ein Fehler.

    Ach so, Danke für die Info.

    Dem OP sei noch gesagt: Die Allozierung die Du implementiert hast ist soweit korrekt.

    Ja und zum sizeof() siehe meine Antwort 17:13:55 07.06.2015.

    Ist aber irgendwie ein schlechter Running Gag, oder?

    imho ja mit gleicher Begründung wie hustbaer.



  • DirkB schrieb:

    Früher, bzw. damals im letzten Jahrtausend, gab malloc einen char* zurück.

    Das war allerdings noch in den ersten Versionen von C.
    Da die zweite Ausgabe allerdings schon Ansi-C beschreibt, ist das dort ein Fehler.

    Aha, womöglich wurde es aus der ersten Ausgabe übernommen!?
    Danke jedenfalls für die Erläuterung.



  • In dem Buch sind Fehler. In der deutschen und auch in der Originalausgabe.

    Einer der Autoren hatte auf seiner Webseite auch mal eine Errata Liste.
    Die Seite von Ritchie ist nicht mehr vorhanden und auf der Seite von Kernighan ist ein Dead-Link. 😞



  • Für K&R2 gibts Korrekturen, die enthalten auch das Problem mit dem (ab C89) unnötigen (und u.U. andere Compiler-Fehlermeldungen verdeckenden) Cast auf S.142:

    The remark about casting the return value of malloc ("the proper method is to declare ... then explicitly coerce") needs to be rewritten. The example is correct and works, but the advice is debatable in the context of the 1988-1989 ANSI/ISO standards. It's not necessary (given that coercion of void * to ALMOSTANYTYPE * is automatic), and possibly harmful if malloc, or a proxy for it, fails to be declared as returning void *. The explicit cast can cover up an unintended error. On the other hand, pre-ANSI, the cast was necessary, and it is in C++ also.
    Errata for The C Programming Language, Second Edition (Original, leider mittlerweile broken)
    Errata for The C Programming Language, Second Edition



  • 👍


Anmelden zum Antworten