memcpy 的奇怪行为
weird behaviour of memcpy
我想将一个无符号长整数逐字节复制到字符缓冲区。
如果我使用注释下的行,它不会被复制到缓冲区。
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]);
}
以下是每个值的两次运行的输出:
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)
it is not copied to buffer.
是的。
cout << ... << buf << endl;
const int len = strlen(buf);
不清楚为什么您没有预料到您看到的输出。 0 是空终止符的值。如果整数的最低内存顺序字节为 0,则缓冲区包含表示空字符串的空终止字符串。在这种情况下,您看到的输出是意料之中的。在小端系统(以及 long
宽于 4 字节的大端系统上)恰好是 268435456 的情况,它是十六进制的 0x10'00'00'00。
只是因为您复制的字节代表空字符串,并不意味着这些字节没有被复制。
十六进制,268435456为1000000016。您的 C++ 将 unsigned long
的字节存储在内存中,而 low-value 字节更早地存储在内存中,因此它作为字节存储在内存中,值为 0016, 00 16, 0016, 1016.
memcpy
正确地将这些字节复制到 buf
.
然后,当strlen(buf)
检查buf
时,它首先找到一个空字节(0016)。这表明 buf
中的字符串长度为零,因为终止字符立即出现在开头。所以 strlen(buf)
return 为零。
由于此 return 值已分配给 len
,因此循环 for (int i = 0; i < len; i++)
执行零次迭代。
同样,在 cout << "Value after unsigned long int copy - buf: " << buf << endl;
中,buf
包含一个零长度的字符串,因此不会为它打印任何字符。
我想将一个无符号长整数逐字节复制到字符缓冲区。 如果我使用注释下的行,它不会被复制到缓冲区。
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]);
}
以下是每个值的两次运行的输出:
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)
it is not copied to buffer.
是的。
cout << ... << buf << endl; const int len = strlen(buf);
不清楚为什么您没有预料到您看到的输出。 0 是空终止符的值。如果整数的最低内存顺序字节为 0,则缓冲区包含表示空字符串的空终止字符串。在这种情况下,您看到的输出是意料之中的。在小端系统(以及 long
宽于 4 字节的大端系统上)恰好是 268435456 的情况,它是十六进制的 0x10'00'00'00。
只是因为您复制的字节代表空字符串,并不意味着这些字节没有被复制。
十六进制,268435456为1000000016。您的 C++ 将 unsigned long
的字节存储在内存中,而 low-value 字节更早地存储在内存中,因此它作为字节存储在内存中,值为 0016, 00 16, 0016, 1016.
memcpy
正确地将这些字节复制到 buf
.
然后,当strlen(buf)
检查buf
时,它首先找到一个空字节(0016)。这表明 buf
中的字符串长度为零,因为终止字符立即出现在开头。所以 strlen(buf)
return 为零。
由于此 return 值已分配给 len
,因此循环 for (int i = 0; i < len; i++)
执行零次迭代。
同样,在 cout << "Value after unsigned long int copy - buf: " << buf << endl;
中,buf
包含一个零长度的字符串,因此不会为它打印任何字符。