Problem mit memcpy()



  • Guten Tag,
    habe ein Problem mit memcpy().
    Zeige euch erstmal den Source:

    [cpp]
    typedef struct {
    char test1[128];
    char test2[128];
    }test;

    void testfun() {
    test a;
    test *b;

    sprintf(a.test1,"TEST1");
    sprintf(a.test2,"TEST2");

    memcpy(&b,&a,sizeof(test));

    printf("b->test1: %s\n",b->test1); //hier stürtzt des Programm ab
    printf("b->test2: %s\n",b->test2);
    }

    So ich denke der Source beschreibt mein Problem.
    Wie kann ich dieses Problem beheben?



  • naja, b ist nicht initialisiert. probier mal so:

    ...
    test *b = malloc (sizeof(test));
    if (!b)
    {
       exit(-1); // malloc ging schief
    }
    ...
    

    🙂



  • Ok also Programm stürtzt nicht mehr ab.
    Aber ich bekommen nichts ausgegeben.
    Was ist hie bei der Sinn von malloc? Also ich weiß das man mit malloc speicher reservieren kann aber verstehe nicht ganz wieso du da malloc benuttz hast.
    Könntest mirs kurz erklären?



  • bin mir jetzt nicht ganz sicher aber das

    memcpy(&b,&a,sizeof(test));

    müßte eigentlich

    memcpy(b,&a,sizeof(test));

    heißen da b schon ein zeiger ist oder?



  • BigProblem schrieb:

    Was ist hie bei der Sinn von malloc?

    naja, der pointer muss irgendwo hinzeigen, wo sich eine 'test-struct' befindet.
    du könntest auch sowas machen:

    ...
    test *b;  // pointer zeigt irgendwo hin
    test t;   // eine neue test-struct
    b = &t;   // nun hat der pointer ein ziel (nämlich t)
    ...
    

    🙂



  • //fricky schrieb:

    naja, b ist nicht initialisiert.

    Doch, ist es.

    c_newbie schrieb:

    bin mir jetzt nicht ganz sicher aber das

    memcpy(&b,&a,sizeof(test));

    müßte eigentlich

    memcpy(b,&a,sizeof(test));

    heißen da b schon ein zeiger ist oder?

    An dieser Stelle ist b allerdings noch nicht initialisiert. Das hilft uns also auch nicht weiter.

    Das Problem ist einfach erklärbar und beginnt bereits an folgender Stelle:

    memcpy(&b,&a,sizeof(test));
    

    Hier werden in b, was ein Zeiger ist, Daten der Grösse sizeof(test) kopiert. Und auf typischen Plattformen ist b kleiner. Man schreibt also auf Speicherbereiche, die einem gar nicht gehören oder im schlimmsten Fall gar nicht existieren. Selbst wenn die Anwendung hier noch nicht abstürzt, ist sie an dieser Stelle trotzdem kaputt.

    Warum die Anwendung dann bei printf abstürzt, hat wiederum einen anderen Grund. memcpy kopiert in unserem Fall die Zeichenkette "TEST1" auf Bitebene in einen Zeiger. Und das ergibt normalerweise keine gültige Adresse. b-> ist also ein Zugriff ins Nirwana.

    Was du genau machen willst, ist mir unklar. Der Zeiger b hat im Beispiel jedenfalls keinen wirklichen Nutzen. Wenn du etwas ausführlicher beschreiben würdest, was du machen willst, könnte man dir sicherlich besser helfen.

    Ansonsten

    memcpy(&b,&a,sizeof(test));
    

    in

    b = &a;
    

    ändern und der Code wäre zumindest fehlerfrei.



  • BigProblem schrieb:

    Guten Tag,
    habe ein Problem mit memcpy().
    Zeige euch erstmal den Source:

    typedef struct {
      char test1[128]; 
      char test2[128];
    }test;
    
    void testfun() {
     test a;
     test *b;
    
        sprintf(a.test1,"TEST1");
        sprintf(a.test2,"TEST2");
    
         memcpy(&b,&a,sizeof(test));
    
           printf("b->test1: %s\n",b->test1);  //hier stürtzt des Programm ab
           printf("b->test2: %s\n",b->test2);
    }
    

    So ich denke der Source beschreibt mein Problem.
    Wie kann ich dieses Problem beheben?

    typedef struct {
    char test1[128];
    char test2[128];
    }test;
    /*	besser so schreiben:
    struct test
    {
    char test1[128];
    char test2[128];
    };
    */
    void testfun() {
    test a;
    test b;
    
    sprintf(a.test1,"TEST1");
    sprintf(a.test2,"TEST2");
    
    memcpy(&b,&a,sizeof(test));
    
    printf("b.test1: %s\n",b.test1); 
    printf("b.test2: %s\n",b.test2);
    }									 
    
    int main()
    {
    	testfun();
    }
    

    Wenn Du es so schreibst läufts jedenfalls wie Du es Dir wünschst.
    Also keinen Zeiger auf test deklarieren, definieren sondern eine weitere Instanz von Test.
    Davon könnte man sich dann die Adresse holen und in einen Zeiger auf Test packen (Test* c = &b; )
    und dann diesen Zeiger mit c->test1 dereferenzieren usw. usw.
    😉


Anmelden zum Antworten