malloc() und der cast



  • Fabeltier schrieb:

    ...
    Was ist der Unterschied zwischen a) und b) oder gibt es da keinen ...

    hallo !

    b versteckt eventuelle fehler und macht es somit mühsamer sie zu finden.
    a nicht.

    🙂



  • b versteckt eventuelle fehler und macht es somit mühsamer sie zu finden.
    a nicht.

    Ich würde das so nicht unterschreiben. Hat beides seine Vor- und Nachteile. Wenn ich pText zum Typ wchar_t* ändern würde, würde ich in Var. b wenigstens eine Warnung bekommen. Also gilt ebenfalls:

    a versteckt eventuelle fehler und macht es somit mühsamer sie zu finden.
    b nicht.

    🙂



  • bgdnoy schrieb:

    Wenn ich pText zum Typ wchar_t* ändern würde, würde ich in Var. b wenigstens eine Warnung bekommen.

    Das Argument zieht aber nur wegen des zweiten gerne gemachten "Fehlers", nämlich des hartkodierten (Ziel-)Typs im sizeof bei der Berechnung des benötigten Speichers.

    c) ohne cast und generisch:

    char *pText = NULL;
    if( (pText = malloc(10 * sizeof(*pText))) == NULL) return EXIT_FAILURE;
    

    Hier kann man nun den Typen von pText (fast) beliebig ändern, ohne dass ein Problem auftaucht. Nur bei void* würde das nicht gehen, was aber ohnehin mit einem Compilerfehler quittiert wird.



  • Du hast natürlich erkannt, daß das ganze ein Scherz ist. Aber wie viele haben das wohl ernst genommen?



  • bgdnoy schrieb:

    Du hast natürlich erkannt, daß das ganze ein Scherz ist. Aber wie viele haben das wohl ernst genommen?

    Entschuldige, mein Humorempfinden befindet sich heute wieder einmal an der Grenze zur Unmessbarkeit - kanst mir den erklären?

    IMVHO ist die Frage (da wir hier im C-Forum sind) mit "der cast ist schlicht unnötig" zu quittieren.

    greetz, Swordfish



  • IMVHO ist die Frage (da wir hier im C-Forum sind) mit "der cast ist schlicht unnötig" zu quittieren.

    Aber nur wenn man Tims Variante c verwendet. Der Rest ist Unfug; lustig ist, daß die zuerst gar nicht vorgeschlagen wurde, und trotzdem Leute kommen und Unfug a über Unfug b stellen.



  • Der Cast ist so oder so nicht nötig.

    greetz, Swordfish

    PS: richtig lesen.



  • bgdnoy schrieb:

    Aber nur wenn man Tims Variante c verwendet. Der Rest ist Unfug; lustig ist, daß die zuerst gar nicht vorgeschlagen wurde, und trotzdem Leute kommen und Unfug a über Unfug b stellen.

    variante c hat zwar einen kleinen vorteil, aber mit der eigentlichen frage 'cast oder nicht-cast' gar nichts zu tun.
    🙂



  • PS: richtig lesen.

    Nicht böse sein, Süßer, aber ich hab gar nicht dich, sondern den ugga ugga gemeint.

    cast oder nicht-cast?



  • Kann mir einer der Fans einen echten C-Compiler nennen, der wenn man den void-Zeiger den malloc() liefert, in den Zieltyp-Zeiger castet
    dies mit einer Warnung oder einer Fehlermeldung quitiert?
    Danke!



  • Warum sollte der Compiler warnen?

    bgdnoy schrieb:

    Swordfish schrieb:

    IMVHO ist die Frage (da wir hier im C-Forum sind) mit "der cast ist schlicht unnötig" zu quittieren.

    Aber nur wenn man Tims Variante c verwendet.

    bgdnoy schrieb:

    PS: richtig lesen.

    Nicht böse sein, Süßer, aber ich hab gar nicht dich, sondern den ugga ugga gemeint.

    Erstens bin ich kein 'Süßer' - am allerwenigsten für dich, und 2. ist und bleibt der Cast unnötig - egal in welcher Variante.

    greetz, Swordfish



  • Du steigst auch auf jeden Blödsinn ein, oder? Wie alt bist du eigentlich?



  • bgdnoy schrieb:

    Du steigst auch auf jeden Blödsinn ein, oder? Wie alt bist du eigentlich?

    Wenn du nichts zu sagen hast, dann sage bitte nichts.
    Es obliegt den Leuten selbst ob sie Fragen beantworten. Das Thema hier ist zB durchaus relevant. Denn es gibt Gruende warum ein Cast Sinnvoll erscheint. Das ist nunmal Fakt. Also ist es legitim darueber zu reden ob es sinnvollere Gruende gibt die dagegen sprechen.



  • Da hast du mich mißverstanden. Wenn ich nicht drüber reden wollte, würde ich's ja nicht lesen. Aber auf welche Weise ich mich über Wichtigtuer lustig mache, wenn sie Unsinn reden, überlaß bitte mir.

    Und bitte nimme das "e" vom Ende des Imperativs, das tut mir fast so weh wie greetz, Swordfish.



  • bgdnoy schrieb:

    Da hast du mich mißverstanden. Wenn ich nicht drüber reden wollte, würde ich's ja nicht lesen. Aber auf welche Weise ich mich über Wichtigtuer lustig mache, wenn sie Unsinn reden, überlaß bitte mir.

    Tut mir leid, aber da ich hier fuer die Ordnung verantwortlich bin geht es mich sehr wohl an ob du trollst. Also unterlass es bitte hier zu trollen.

    danke.



  • was gibts da eigentlich zu diskutieren?
    einfacher ist besser. punkt.



  • Diskussionen über mich bitte hier fortsetzen.



  • Fabeltier schrieb:

    Hallo,
    ich hab mal ne Grundsatzfrage zu malloc() und dem casting, welches ich dabei manchmal sehe:
    Was ist der Unterschied zwischen a) und b) oder gibt es da keinen - ich glaube bei mir noch nie einen Unterschied bemerkt zu haben?

    a) ohne cast:

    char* pText = NULL;
    if( (pText = malloc(10 * sizeof(char))) == NULL) return EXIT_FAILURE;
    

    b) mit cast:

    char* pText = NULL;
    if( (pText = (char*)malloc(10 * sizeof(char))) == NULL) return EXIT_FAILURE;
    

    um zur ursprünglichen Frage zu kommen: Die Variante b kann versteckte Fehler vertuschen, die man nur sehr mühsam zu finden sind [1].

    Der Grund warum sehr oft ein gecastetes malloc sieht, ist dass viele Autoren (von Büchern, Tutorialen, usw) C Code mit einem C++ Compiler kompilieren und dort muss man den void Pointer casten.

    [1] bsp: du schreibst ein Programm, welches nicht automatisch gegen die C Bibliothek gelinkt wird. Du hast es eine eigene Funktion malloc die einen int zurückliefert (und an dieser Stelle sei es eagl, was sie tut) und aus alter Gewohnheit hast du die Variable als char* statt int deklariert. Die Variante a hätte den Fehler gefunden und dir mind. eine Warnung gegeben. Variante b hätte dem Compiler gesagt, "sche.iss drauf, ob's feherhaft ist, tu es einfach ohne zu meckern". 😉



  • Gut, also danke fuer die ausfuehrliche Beantwortung meiner Frage. Ich verstehe das jetzt mal als "Stilfrage" und denke, beide Moeglichkeiten haben ihre Vorteile und Nachteile. Moeglichkeit C gefaellt mir jedoch am besten, danke fuer den Tipp 😉


Anmelden zum Antworten