seltsames Verhalten von memcpy
Ich möchte eine vorzeichenlose lange Ganzzahl byteweise in den Zeichenpuffer kopieren. Wenn ich die Zeile unter Kommentar verwende, wird sie nicht in den Puffer kopiert.
char buf[128];
//unsigned long int_val = 268435456;
unsigned long int_val = 293456376;
cout << "Value of int_val: " << int_val << endl;
memset(buf, 0, sizeof(buf));
memcpy(buf, &int_val, sizeof(long));
cout << "Value after unsigned long int copy - buf: " << buf << endl;
const int len = strlen(buf);
cout << "buf" << endl << "====" << endl;
for (int i = 0; i < len; i++)
{
printf("%3d (0x%02X)\n", buf[i], buf[i]);
}
Es folgt die Ausgabe von zwei Läufen mit jedem Wert:
Value of int_val: 268435456
Value after unsigned long int copy - buf:
buf
===
Value of int_val: 293456376
Value after unsigned long int copy - buf: ��}
buf
===
-8 (0xFFFFFFF8)
-55 (0xFFFFFFC9)
125 (0x7D)
17 (0x11)
Antworten
Hexadezimal ist 268435456 10000000 16 . Ihr C ++ speichert die Bytes eines unsigned longIn-Speichers mit dem niederwertigen Byte früher im Speicher, sodass dieses als Bytes mit den Werten 00 16 , 00 16 , 00 16 , 10 16 im Speicher gespeichert wird .
memcpykopiert diese Bytes korrekt in buf.
Bei der strlen(buf)Untersuchung bufwird dann zuerst ein Null-Byte (00 16 ) gefunden. Dies zeigt an, dass die Zeichenfolge in bufeine Länge von Null hat, da das abschließende Zeichen unmittelbar am Anfang erscheint. So strlen(buf)kehrt Null.
Da dieser Rückgabewert zugewiesen ist, lenführt die Schleife for (int i = 0; i < len; i++)keine Iterationen durch.
In ähnlicher Weise in cout << "Value after unsigned long int copy - buf: " << buf << endl;, bufenthält eine Reihe von Null - Länge, so dass keine Zeichen für sie gedruckt werden.
Es wird nicht in den Puffer kopiert.
Ja, so ist es.
cout << ... << buf << endl; const int len = strlen(buf);
Es ist unklar, warum Sie die angezeigte Ausgabe nicht erwartet haben. 0 ist der Wert des Null-Abschlusszeichens. Wenn das niedrigste Speicherordnungsbyte der Ganzzahl 0 ist, enthält der Puffer die nullterminierte Zeichenfolge, die die leere Zeichenfolge darstellt. In diesem Fall ist die angezeigte Ausgabe zu erwarten. Auf Little-Endian-Systemen (und auch auf Big-Endian-Systemen, die longbreiter als 4 Byte sind) ist dies bei 268435456 der Fall, was hexadezimal 0x10'00'00'00 ist.
Nur weil die von Ihnen kopierten Bytes die leere Zeichenfolge darstellen, bedeutet dies nicht, dass die Bytes nicht kopiert wurden.