将结构体指针转换为uint8_t *会引发错误。

3
在我的函数中,我为一个叫做messagePacket的结构体分配内存并填入数据。
struct messagePacket *packet = malloc(sizeof(struct messagePacket));
//fill

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

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

我已经成功地完成了以下操作,并且我知道我可以使用这种方法作为解决方法。我在这里是因为我宁愿从中学习而不是绕过它。

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

结构体messagePacket大小为1209 B。我的最佳猜测是,该内存块非常大,因此它被存储在高内存地址中,比如16字节地址?但这与我可以malloc出相同大小的uint8_t *的事实不符。


sendBuf 是做什么用的? - cnicutar
@cnicutar 我觉得这不重要,因为类型转换似乎是问题的原因 - thumbmunkeys
@pivotnig 我认为这很重要,因为强制转换可能是多余的或者完全错误的。根据标准,它已经相当错误了。 - cnicutar
sendBuf接受uint8_t *,创建一个类似的uint8_t * recvBuf = sizeof(struct messagePacket),通过端口发送数据,使用select()函数并接收数据。 - austin
代码 #include <stdio.h> #include <stdlib.h> struct messagePacket { int a; int b[2000]; }; void sendBuf(char * d) { int c; c=*d; }int main() { struct messagePacket packet = malloc(sizeof(struct messagePacket)); sendBuf((unsigned char)packet); return 0; }我看不到错误。 - wuliang
2个回答

2
我猜编译器注意到你的结构体大于8位,使用uint8_t只能寻址结构体的第一个字节。既然这似乎是有意的,你可以将其转换为(void*),然后再转换为(uint8_t*)。但你应该告诉sendBuf缓冲区大小,即sizeof(struct messagePacket)。

编译器对这种双重转换的花招太聪明了。而且send buf肯定会得到那个大小。 - austin

0

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

作为一个一般性的想法,sendBuf()函数应该使用const void *而不是const uint8_t *来发送数据。参见send()和相关函数。


解开胜利。我需要在提问方面变得更好(例如:至少发布完整的代码)。我将sizeof(struct messagePacket)传递给类型为uint8_t的参数,这远远超出了范围。我忽略了这一点,因为我的参数位于不同的行上,编译器指向了我最初询问的那一行。 - austin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接