转换为uint8_t *的结构指针会引发错误

时间:2012-04-26 07:32:23

标签: c memory-management casting compiler-errors truncate

在我的函数中,我为内存分配并填充一个名为messagePacket

的结构
struct messagePacket *packet = malloc(sizeof(struct messagePacket));
//fill

当我尝试将指针强制转换为(uint8_t *)时,gcc会抛出一条警告:大整数被隐式截断为无符号类型

sendBuf(..., (uint8_t *)packet);

我已经能够做到以下几点了,我知道我可以使用这种方法作为解决方法。我在这里是因为我宁愿从中学习而不是解决它。

uint8_t *buf = malloc(sizeof(struct messagePacket));

struct messagePacket = 1209 B的大小。我最好的猜测是内存块超大,我存储在高内存地址中,例如16位的地址?但这与我可以使用相同大小的uint8_t *的事实不符合。

2 个答案:

答案 0 :(得分:2)

我猜编译器注意到你的结构大于8位并使用uint8_t,你只会解决结构的第一个字节。 由于这似乎是有意的,你可以转为(void *)然后转为(uint8_t *)。 但是你应该告诉sendBuf缓冲区大小是sizeof(struct messagePacket)

答案 1 :(得分:0)

我认为警告是关于其他一些论点。请提供该行的完整代码,sendBuf()函数的原型以及相关行的完整编译器警告。

总的来说,sendBuf()函数应该使用const void *而不是const uint8_t *来发送数据。请参阅send()和朋友。