perilaku aneh memcpy
Saya ingin menyalin integer panjang unsigned ke char buffer byte demi byte. Jika saya menggunakan baris di bawah komentar, itu tidak disalin ke buffer.
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]);
}
Berikut adalah output dari dua proses dengan masing-masing nilai:
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)
Jawaban
Dalam heksadesimal, 268435456 adalah 10000000 16 . C ++ Anda menyimpan byte unsigned longdalam memori dengan byte bernilai rendah sebelumnya di memori, jadi ini disimpan dalam memori sebagai byte dengan nilai 00 16 , 00 16 , 00 16 , 10 16 .
memcpymenyalin byte ini dengan benar ke buf.
Kemudian, ketika strlen(buf)diperiksa buf, ia menemukan byte nol (00 16 ) terlebih dahulu. Ini menunjukkan string karakter dalam bufmemiliki panjang nol, karena karakter pengakhir segera muncul di awal. Jadi strlen(buf)mengembalikan nol.
Karena nilai kembalian ini ditetapkan len, loop for (int i = 0; i < len; i++)melakukan iterasi nol.
Demikian pula, in cout << "Value after unsigned long int copy - buf: " << buf << endl;, bufberisi string dengan panjang nol, jadi tidak ada karakter yang dicetak untuknya.
itu tidak disalin ke buffer.
Ya itu.
cout << ... << buf << endl; const int len = strlen(buf);
Tidak jelas mengapa Anda tidak mengharapkan output yang Anda lihat. 0 adalah nilai karakter terminator nol. Jika byte urutan memori terendah dari integer adalah 0, maka buffer berisi string diakhiri null yang mewakili string kosong. Dalam kasus seperti itu, keluaran yang Anda lihat adalah yang diharapkan. Pada sistem little endian (dan juga pada sistem big endian longyang lebih lebar dari 4 byte) yang terjadi adalah kasus untuk 268435456 yaitu 0x10'00'00'00 dalam heksadesimal.
Hanya karena byte yang Anda salin mewakili string kosong, tidak berarti byte tersebut tidak disalin.