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.


Anmelden zum Antworten