【问题标题】:Truncated value is being stored正在存储截断的值
【发布时间】:2026-02-10 05:45:02
【问题描述】:

这是我的缓冲区,谁能解释我如何在其中存储一个十六进制值,当我尝试打印 buffer[0] 时,它打印的是 0 而不是 500。我正在尝试用ID 是 11 位,我知道 char 是 1 字节,即 8 位,它不能存储值。我还有其他元素要填充到缓冲区中,它们是 char 类型。所以我不能将缓冲区的类型从 char 更改为 int。我该如何解决我的问题。

char *buffer;
buffer = (char *)malloc(10*(sizeof(frameRd)));      //frameRd is of 16bytes
buffer[0] = frameRd->id;
for(int i =1;i<15;i++)
{
  buffer[i] = frameRd->data;
}
for(int i =0,i<16;i++)
{
 printf("%4X",buffer[i]);
}

当我在控制台上打印此值时,frame-&gt;id = 0x500;buffer[0] 打印为 0,这肯定是因为

【问题讨论】:

  • 请发布显示问题的Minimal, Complete, and Verifiable example,例如未显示frameRd。将输入、预期输出和实际输出显示为问题中的文本
  • 0x500 的最低有效字节是0buffer 是指向char 的指针。
  • 请停止修改问题并按要求发布 MCVE。

标签: c arrays char hex


【解决方案1】:

因为bufferchar*,所以buffer[0]char。因此,赋值

buffer[0] = frameRd->id;

表示“将frameRd-&gt;id 截断为char,并将结果存储在buffer[0]”中,即正是您正在观察的效果。此外,当您使用%4X 打印buffer[0] 时,您将单独打印buffer[0] 的值,转换为int

如果要将int 或整个struct 放入char[] 缓冲区,请使用memcpy

// Do not cast results of malloc
buffer = malloc(10*(sizeof(frameRd)));
// Save id into the buffer at index 0
memcpy(&buffer[0], &frameRd->id, sizeof(frameRd->id));
// Pull id back
int tmpId;
memcpy(&tmpId, &buffer[0], sizeof(tmpId));
printf("%04x\n", tmpId);

Demo.

【讨论】:

  • 之后,如果我打印缓冲区元素从 0 到 15,我可以看到 frameRd-&gt;id 的值吗?
  • @user8540390 由于id 是多字节的,如果您单独打印buffer 的字节,您将能够看到以计算机特定顺序表示frameRd-&gt;id 的各个字节。您可能会看到 00 00 50 0000 50 00 00,具体取决于 CPU 架构。