C 通过引用而不是指针传递结构到缓冲区的强制转换问题

C 通过引用而不是指针传递结构到缓冲区的强制转换问题,c,linux,casting,libusb,libusb-1.0,C,Linux,Casting,Libusb,Libusb 1.0,通过引用传递结构时,会出现转换错误。将指针传递到缓冲区可以正常工作。函数getstuff实际上是libusb_claim_接口,删除了不相关的部分。我正试图从插入Linux机器的USB设备中获取一大块数据 数据是根据以下结构输入的: 但是,我使用的代码会传递一个无符号字符的缓冲区。然后,缓冲区需要设置每个单独的结构成员 例如: getstuff(unsigned char *data, int length); void foo(void) { unsigned char apple;

通过引用传递结构时,会出现转换错误。将指针传递到缓冲区可以正常工作。函数getstuff实际上是libusb_claim_接口,删除了不相关的部分。我正试图从插入Linux机器的USB设备中获取一大块数据

数据是根据以下结构输入的:

但是,我使用的代码会传递一个无符号字符的缓冲区。然后,缓冲区需要设置每个单独的结构成员

例如:

getstuff(unsigned char *data, int length);
void foo(void)
{
  unsigned char apple;
  unsigned short banana;
  unsigned char cherry;
  unsigned char date;
  ...
  unsigned char buffer[44];

  sendstuff(...);
  getstuff(buffer, 44);
  apple = buffer[0];
  banana = buffer[1];
  cherry = buffer[2];
  date = buffer[3];
  ...
}
我不想这样做,而是想在上面实际定义一个结构,并传递对该结构的引用,然后明智地访问成员,如下所示:

getstuff(unsigned char *data, int length);
void foo(void)
{
  unsigned char apple;
  unsigned short banana;
  unsigned char cherry;
  unsigned char date;
  ...
  mystruct_t *fruits;

  sendstuff(...);
  getstuff((unsigned char) fruits, sizeof(mystruct_t));
  apple = fruits->a;
  banana = fruits->b;
  cherry = fruits->c;
  date = fruits->d;
  ...
}
但这不起作用。首先,我在编译时得到:

warning: cast from pointer to integer of different size [-Wpointer
-to-int-cast]
(unsigned char) fruits,

warning: passing argument 3 of ‘getstuff’ makes pointer from
integer without a cast [-Wint-conversion]
然后,在解析libusb.h时抛出:

note: expected ‘unsigned char *’ but argument is of type ‘unsigned char’
int LIBUSB_CALL libusb_bulk_transfer(libusb_device_handle *dev_handle,
当我运行程序时,设备似乎发回21906字节,而不是预期的44字节。如果我将结果转换为unsigned char*,程序编译时不会有任何抱怨,但随后我返回的字节数从21900到22060。我可以通过像原始代码中那样简单地传递一个无符号字符数组来解决这个问题,但这样做是为了将指针复制到mystruct\u t*fruits:

但我真的很想知道发生了什么,以及为什么我在转换结构时遇到这么多困难。

getstuffunsigned char fruits,sizeofmystruct;=>GetStuff unsigned char*水果,sizeof*水果

水果=mystruct\u t*缓冲区;这一个被称为指针双关,是不安全的,不可移植的,一般来说

另一个问题是没有为结构分配内存

你可以:

  mystruct_t fruits;
  ....
  getstuff((unsigned char *)&fruits, sizeof(fruits));

getstuffunsigned char Friews,sizeofmystruct\u t;=>GetStuff unsigned char*水果,sizeof*水果

水果=mystruct\u t*缓冲区;这一个被称为指针双关,是不安全的,不可移植的,一般来说

另一个问题是没有为结构分配内存

你可以:

  mystruct_t fruits;
  ....
  getstuff((unsigned char *)&fruits, sizeof(fruits));


您可能应该强制转换为unsigned char*,而不是unsigned char,因为getstuff需要unsigned char*。看起来你在打电话给getstuff的时候也错过了一个结束语。最后,您是否尝试通过打印或记录mystruct\t的大小来查看它?在编译器抱怨之后,我展示了当我强制转换到unsigned char*时发生的情况。sizeofmystruct_t是44,与buffer[]相同。您如何知道返回的是21900到22060字节?我认为这些消息是不言自明的。您可以使用pointer@P__J__我认为这些消息也是不言自明的,但OP似乎仍然存在问题。您可能应该强制转换为unsigned char*,而不是unsigned char,因为getstuff需要unsigned char*。看起来你在打电话给getstuff的时候也错过了一个结束语。最后,您是否尝试通过打印或记录mystruct\t的大小来查看它?在编译器抱怨之后,我展示了当我强制转换到unsigned char*时发生的情况。sizeofmystruct_t是44,与buffer[]相同。您如何知道返回的是21900到22060字节?我认为这些消息是不言自明的。您可以使用pointer@P__J__我认为这些信息也是不言自明的,但OP似乎仍然存在问题。
  mystruct_t fruits;
  ....
  getstuff((unsigned char *)&fruits, sizeof(fruits));
  mystruct_t *fruits = malloc(sizeof(*fruits));
  /* malloc checks + .... */
  getstuff((unsigned char *)fruits, sizeof(*fruits));