[C/C++] memcpy macht mist??

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von myth2806, 27. November 2008 .

Schlagworte:
  1. 27. November 2008
    memcpy macht mist??

    Hi,

    ich sitzte grade an einem kleinen C-Programm und stehe vor einem Problem bei dem ich den Fehler nicht finde.
    Ich will ein paar Int-Variablen in ein "unsigned char"-Speicherbereich packen, weil ich sie anschliessend gemeinsam verschicken will. Denk ich mir kein Problem und schreib, von der Logik her, folgendes:

    Code:
    char *buf;
    int x;
    
    buf = malloc(20);
    x = 23;
    
    memcpy(buf, &x, 4);
    
    Sollte ja eigendlich funktionieren.
    Um das ganze zu kontrollieren, habe ich mir eine kleine Funktion gebaut, die mir Bit-Weise einen Speicherbereich anzeigen kann:

    Code:
    void *printBits(ptr, len)
     u_char *ptr;
     u_int len;
    
    {
     u_char bit, *end;
    
     // Speicherende definieren
     end = ptr + len;
    
     // Schleife durchläuft Speicherbereiche
     for (; ptr < end; ptr++) {
    
     // Und die einzelnen Bits
     for (bit = 0; bit < 8; bit++)
     putchar((*ptr & (128 >> bit)) ? '1' : '0');
    
     putchar(' ');
     }
    }
    
    Die Funktioniert auch problemlos so weit ich das bisher ausprobiert habe.
    Das Problem ist jetzt, dass er die Byteorder nicht so richtig ein zu halten scheint. Wenn ich zB die Zahl 23 in den Speicherbereich kopiere, bekomme ich folgendes Ergebnis:

    Code:
    00010111 00000000 00000000 00000000
    
    Eigendlich müssten die gesetzten Bits ja ganz rechts vorzufinden sein :angry:
    Wenn ich eine sehr große Zahl nehme, die alle 4 Bytes in anspruch nimmt, und sie in den Speicherbereich kopiere, ist das Ergebnis richtig. Aber warum hier nicht????

    Danke
     
  2. 27. November 2008
    AW: memcpy macht mist??

    memcpy macht seine Arbeit schon richtig, nur deine Denkweise ist falsch, in bezug auf die Benutzung der Funktion ( Deklarationsstil ist ziehmlich alt ).

    -> 00010111 = 23 ( Von deinem Beispiel )

    Dein String bekommt einfach den Wert zugewiesen, und zwar in Form von einem Byte ( Der Integer 23 ist ja auch keine 4 Byte groß ).

    Also müsste es aussehen:

    Code:
    int main( void )
    {
     char out[10] = {0};
     int a = 23;
    
     *(int*)out = a; // du benutzt stattdessen memcpy
    
     printBits( out, 1 ); // 1 Byte
     return 0;
    }
    Mach's am besten einfach per itoa, ..
     
  3. 27. November 2008
    AW: memcpy macht mist??

    Hey!

    'ABCD' wird ja auch als 'ABCD' und nicht als 'DCBA' gespeichert.
    Wenn du also 4 bytes hast, musst du den Pointer auf das letzte byte schieben (shiften) und da dann was reinkopieren.

    Mfg,

    Kolazomai
     
  4. 27. November 2008
    AW: memcpy macht mist??

    Ich hab extra mit sizeof(x) geguckt, der ist 4 Byte groß. Wäre ja ansonten auch irgendwie schwachsinn. Dann müsste der Computer ja einen realloc durchführen wenn man in eine Integer-Variable einen Wert über 256 speichert.
    Dein Ansatz funktioniert leider nicht. Ich bekomme wieder das gleiche ergebnis. Und itoa kann ich nicht benutzten weil es bei der Übertragung aus Performance-Gründen um jeder Byte geht.

    @Kolazomai:
    Wenn ich den Pointer auf das letzte Byte setzte, also buf+3, dann überschreibt er mit zusätzlich noch die 3 Bytes anschliessend in meinem Buffer ;(
    Bin ich blöd oder so???



    //edit: ok ich gebs auf. Wenn ich anschliessend den Wert wieder aus dem Buffer rauskopiere, dann ist es richtig. Warum auch immer. Ich verstehs net. Aber es funktioniert
     
  5. 27. November 2008
    AW: memcpy macht mist??

    Dir ist klar, dass Int 4 Bytes groß ist, die restlichen Bytes aber, in deinem Beispiel, ungenutzt sind..?

    Dann machst du was falsch..

    Weitere Erläuterungen unterlasse ich mal, da hier anscheinend ja soweiso ja nur kluggeschissen wird.
     
  6. 27. November 2008
    AW: memcpy macht mist??

    Ich wollte hier niemanden angreifen! Tut mir echt leid wenn das jetzt grade so rübergekommen ist.

    Aber was kann ich dabei schon falsch machen? Wenn ich deinen Code benutze, bekomme ich das gleiche Ergebnis wie wenn ich das ganze mit memcpy() mache. Die reihenfole ist halt vertauscht. (zmd finde ich, dass die Reihenfolge so nicht richtig ist).
    Es funktioniert ja jetzt... mit deinem und auch mit meiner Lösung. Ich kann nur nicht ganz verstehen warum es jetzt funktioniert
     
  7. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.