首页 > 解决方案 > 正在存储截断的值

问题描述

这是我的缓冲区,任何人都可以解释我如何在其中存储一个十六进制值,当我尝试打印时buffer[0],它打印的是 0 而不是 500。我试图用 11 位的 ID 填充缓冲区的一个元素,我知道 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->id = 0x500;我在控制台上打印这个值时,它打印buffer[0]为 0 肯定是因为

标签: carrayscharhex

解决方案


既然bufferchar*buffer[0]就是char。因此,赋值

buffer[0] = frameRd->id;

意思是“截断frameRd->idchar,并将结果存储在 中buffer[0]”,也就是你观察到的效果。此外,当您使用 打印buffer[0]%4X,您会打印单独的值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);

演示。


推荐阅读