我想将无符号长整数逐字节复制到char缓冲区。
如果使用注释下的行,则不会将其复制到缓冲区。
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)
最佳答案
以十六进制表示的268435456是1000000016。您的C++将unsigned long
的字节存储在内存中,而低值字节则存储在内存中的较早位置,因此它以值0016、0016、0016、1016的字节存储在内存中。memcpy
将这些字节正确复制到buf
中。
然后,当strlen(buf)
检查buf
时,它将首先找到一个空字节(0016)。这表明buf
中的字符串长度为零,因为终止字符立即出现在开头。因此strlen(buf)
返回零。
由于此返回值已分配给len
,因此循环for (int i = 0; i < len; i++)
执行零次迭代。
同样,在cout << "Value after unsigned long int copy - buf: " << buf << endl;
中,buf
包含长度为零的字符串,因此不会为它打印任何字符。
关于c++ - memcpy的怪异行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64535229/