【问题标题】:memcpy() to copy integer value to char buffermemcpy() 将整数值复制到字符缓冲区
【发布时间】:2010-11-17 08:07:57
【问题描述】:

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

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

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

...........

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

【问题讨论】:

    标签: c memory pointers memcpy


    【解决方案1】:

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

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

    【讨论】:

    • 因此,这意味着变量中存在值。只是我没有以正确的方式打印。这就是它不显示的原因。对吗?
    • 还有一个疑问,如果我将它移动到另一个内存位置,是否会移动确切的数据(整个十六进制值)?
    【解决方案2】:

    试试

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

    改为。

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

    【讨论】:

      【解决方案3】:

      你在这里的意图是什么?现在,您正在将任意字节值放入 char 数组中,然后将它们解释为字符串,因为碰巧第一个字节可能为零(空),因此您什么也不打印,但很可能许多字符将是无法打印,因此 printf 是用于检查副本是否有效的错误工具。

      因此,要么:遍历数组并打印每个字节的数值,%0xd 可能对此有用,或者如果您的意图实际上是创建 int 的字符串表示,那么您将需要更大的缓冲区,和空终止符的空间。

      【讨论】:

      • 感谢您的澄清 :)
      【解决方案4】:

      也许您需要将 intger 转换为 char* 这样才能使用 itoa 函数 link text

      【讨论】:

      • 谢谢。我不是要转换,而是要复制内存值。
      猜你喜欢
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 2012-07-17
      • 1970-01-01
      相关资源
      最近更新 更多