Hello World (Array) in C, Malloc (Dynamischer Speicher)



  • Hallo Zusammen, im folgenden habe ich ein CodestĂŒck das ein Array kopiert. Die Speicherzuweisung soll dabei mit Malloc festgelegt sein, ich bin mir aber jedoch nicht sicher ob dies in der Form geschrieben wird. Beim kompilieren wurden keine Fehler entdeckt und die Ausgabe "Hello World" auf der Konsole war ohne Probleme.

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    int main () {

    char *a = "Hello World\n";

    char *b;
    b = (char 😉 malloc (5 * sizeof(a));

    strncpy(b, a, strlen(a)+1);

    printf("%s", b);

    free(b);
    return 0;

    }



  • Die GrĂ¶ĂŸenangabe bei malloc ist falsch berechnet und der cast ist nicht nötig.
    a ist ein Pointer und dessen GrĂ¶ĂŸe hat nichts mit dem Speicherbedarf der Daten zu tun.

    Zudem macht das strncpy nicht das was du möchtest, wenn die Maximalzahl der Zeichen erreicht wird.

    b = malloc (strlen(a)+1);  // Das +1 wegen der '\0'
    
    strcpy(b, a); // kein strncpy. Du hast gerade ausreichend Speicher besorgt.
    


  • // kein strncpy. Du hast gerade ausreichend Speicher besorgt.

    Warum dann nicht gleich memcpy ?



  • Bei memcpy musst du ja wieder die "Anzahl Bytes angeben".

    b = malloc (strlen(a)+1)
    

    =>Wie Dirk schon geschrieben hat, hat du ja schon genug Speicher besort, damit es ein einfach strcpy(destination, source) tut...



  • Das ist der Grund in deinen Augen? Ein bisschen mehr Tipparbeit? Ein Komma, ein optionales Leerzeichen und ein mindestens ein Zeichen langer Bezeichner sind dir zu viel?
    Ich hatte ja erwartet, dass das AnfĂ€nger verwirrt, was durchaus der Fall sein könnte. Aber wenn man sich C (die Sprache und auch die Standardbibliothek) so anguckt, ist das doch eher eine verhĂ€ltnismĂ€ĂŸig kleine TĂŒcke.

    Die C-Bibliothek von Microsoft und OpenBSD warnt standardmĂ€ĂŸig bei der Verwendung von strcpy . Portableren, nicht weniger falschen und wahrscheinlich auch schnelleren Code zu schreiben, dĂŒrfte doch auch im Interesse von AnfĂ€ngern sein.



  • Welchen Vorteil bringt hier memcpy ?
    - sicherer? Nein, da ja genug Speicher besorgt wurde.1
    - portabler? Nein, denn strcpy ist in der C-Standardbibliothek.
    - verstÀndlicher? Nein, denn man fragt sich, warum da jetzt memcpy steht.
    - schneller? Möglich dass der Compiler memcpy (minimal) besser optimieren kann.2

    1 Der Erfolgstest fĂŒr malloc muss auch bei memcpy gemacht werden.
    2 Wenn der Compiler optimieren darf, nimmt er z.B. bei x86-Systemen auch die SSE2-Befehle fĂŒr strcpy .

    cpy schrieb:

    Die C-Bibliothek von Microsoft und OpenBSD warnt standardmĂ€ĂŸig bei der Verwendung von strcpy

    Übereifriges Geschrei.
    Wenn du bei memcpy beim dritten Paramter falsche Angaben machst, wird das auch nicht sicherer.

    Das Ganze wird unsicher, wenn der Programmierer nicht weiß was er tut. Aber dann ist es auch egal wie er das tut.


Log in to reply