我想将int的内存值复制到char缓冲区中。代码如下所示,memcpy()将整数值复制到char缓冲区
#define CPYINT(a, b) memcpy(a, &b, 4)
............
char str1[4];
int i = 1;
CPYINT(str1, i);
printf("%s",s);
...........
当我打印str1时,它是空白的。请澄清。
我想将int的内存值复制到char缓冲区中。代码如下所示,memcpy()将整数值复制到char缓冲区
#define CPYINT(a, b) memcpy(a, &b, 4)
............
char str1[4];
int i = 1;
CPYINT(str1, i);
printf("%s",s);
...........
当我打印str1时,它是空白的。请澄清。
您正在将整数的字节表示形式复制到char数组中。然后,您要求printf
将此数组解释为空终止字符串:str1[0]
为零,您实际上正在打印一个空字符串(我在此跳过endianness谈话)。
你期望什么?显然,如果你想打印整数i
的文本表示,你应该使用printf("%d", i)
。
什么是你的本意吗?现在你将任意的字节值放到char数组中,但是将它们解释为一个字符串,因为它发生的第一个字节可能是零(null),因此你的打印没有任何内容,但很可能很多字符都是不可打印,所以printf是用来检查副本是否工作的错误工具。
因此,无论是:循环访问数组并打印每个字节的数值,%0xd可能对此有用,或者如果您的意图实际上是创建int的字符串表示形式,那么您需要更大的缓冲区,并为空终止符空间。
感谢您的澄清:) – arun 2010-11-17 08:33:13
尝试
printf("%02X %02X %02X %02X\n", str1[0], str1[1], str1[2], str1[3]);
代替。
整数1的二进制表示可能包含前导NUL,因此当前的printf语句会比您想要的更早终止。
谢谢。我现在得到了:) – arun 2010-11-17 08:39:24
所以,这意味着,价值在变量中。这只是我没有正确打印。这就是为什么它不显示。是对的吗? – arun 2010-11-17 08:27:25
还有一个疑问,如果我将它移动到另一个存储位置,确切数据(整个十六进制值)是否会移动? – arun 2010-11-17 08:27:59