memcpy()将整数值复制到字符缓冲区

memcpy()将整数值复制到字符缓冲区,c,memory,pointers,memcpy,C,Memory,Pointers,Memcpy,我试图将int的内存值复制到char缓冲区中。代码如下所示 #define CPYINT(a, b) memcpy(a, &b, 4) ............ char str1[4]; int i = 1; CPYINT(str1, i); printf("%s",s); ........... 当我打印str1时,它是空白的。请澄清。您正在将整数的字节表示形式复制到字符数组中。然后要求printf将此数组解释为空终止字符串:str1[0]为零,实际上是打印一个空字符串(我跳过

我试图将int的内存值复制到char缓冲区中。代码如下所示

#define CPYINT(a, b) memcpy(a, &b, 4)
............

char str1[4];
int i = 1;
CPYINT(str1, i);
printf("%s",s);

...........

当我打印str1时,它是空白的。请澄清。

您正在将整数的字节表示形式复制到字符数组中。然后要求
printf
将此数组解释为空终止字符串:
str1[0]
为零,实际上是打印一个空字符串(我跳过这里的讨论)


你期待什么?显然,如果您想打印整数
i
的文本表示,您应该使用
printf(“%d”,i)

也许您需要将intger转换为char*,这样您就可以使用itoa函数了

您在这里的意图是什么?现在,您正在将任意字节值放入char数组中,但随后将它们解释为字符串,因为第一个字节可能是零(null),因此您不打印任何内容,但很可能许多字符都无法打印,因此printf是用于检查复制是否有效的错误工具

因此,或者:在数组中循环并打印每个字节的数值,%0xd对此可能很有用,或者如果您打算创建int的字符串表示形式,则需要更大的缓冲区和空终止符的空间。

试试看

printf("%02X %02X %02X %02X\n", str1[0], str1[1], str1[2], str1[3]);
相反


整数1的二进制表示形式可能包含前导NUL,因此当前printf语句比您希望的更早终止。

因此,这意味着变量中存在值。只是我打印的方式不对。这就是它不显示的原因。是吗?还有一个疑问,如果我把它移到另一个内存位置,确切的数据(整个十六进制值)会被移动吗?谢谢。我不是要转换,而是要复制内存值。感谢您的澄清:)