在C中将整数复制到char缓冲区

JAC*_*K M 0 c

  uint32_t after = 0xe1ca95ee;
  char new_buf[4];
  memcpy(new_buf, &after, 4);
  printf("%x\n", *new_buf); // I want to print the content of new_buf
Run Code Online (Sandbox Code Playgroud)

我想要的内容复制afternew_buf.但结果令人困惑.printf给了我ffffffee.它看起来像一个地址.我已经取消引用了new_buf.

根据评论,我不能使用memcpystrncpy执行此任务.但为什么?memcpy并且strncpy只是为了处理char *?但内容after是在记忆中.

PS:我知道我应该使用sprintfsnprintf.如果你能解释为什么memcpystrncpy不适用于这种情况,我很感激.

Geo*_*dré 5

这就是问题所在:

printf("%x\n", *new_buf);
Run Code Online (Sandbox Code Playgroud)

这为您提供了所要求的内容:它使用%x格式在位置new_buf处打印char.该位置已包含0xee(在您成功的memcpy之后,首先是最不重要的字节,因为您最有可能在Intel机器上,小端),但它打印为0xffffffee(负数),因为它是一个字符而不是unsigned char,因为当然0xee是一个带符号的字节(> 0x7F,最高位集)

您应该使用:

printf("%x\n", *((unsigned int*)new_buf));
Run Code Online (Sandbox Code Playgroud)

...编辑如下......

更确切地说:

printf("%x\n", *((uint32_t*)new_buf));
Run Code Online (Sandbox Code Playgroud)

  • 由于指针别名规则的不对称性,两种建议的构造都有未定义的行为.(您可以通过具有字符类型的指针访问任何类型的对象,但是您不能**通过具有非字符类型的指针访问声明为具有字符类型的对象.) (2认同)