C sizeof(xx) 问题... ??? USB 设备描述符

标签 c usb cortex-m3

我正在编写 USB 设备固件...我有以下 struct typedef

typedef struct  {
    uint8_t bLength;
    uint8_t bDescriptorType;
    uint16_t wTotalLength;
    uint8_t bNumInterfaces;
    uint8_t bConfigurationValue;
    uint8_t iConfiguration;
    uint8_t bmAttributes;
    uint8_t bMaxPower;
} usbtmc_config_descriptor;

根据我的计算,这是 9 个字节,但是当我这样做时

sprintf(temp, "size of config is %02x, %d", sizeof(usbtmc_config_descriptor), sizeof(usbtmc_config_descriptor));
prints(temp);

终端吐出以下内容

size of config is 0a, 10

我完全糊涂了... 如果您想知道 prints() 方法只是我编写的一种方法,用于通过 UART 将字符串打印到 super 终端,然后是\r\n 以便于使用...

对于那些认为重要的人来说,这是整个方法

void prints(const char* message){
    MSS_UART_polled_tx_string(&g_mss_uart0, ((uint8_t *)message));
    unsigned char newline[2] = {0x0A, 0x0D};
    MSS_UART_polled_tx_string(&g_mss_uart0, newline);
}

可能与情况有关的一些背景信息,这是 Cortex M3、Smartfusion Soc 的固件代码,使用带有 GCC 4.4.1 CodeSourcery 工具的 SoftConsole 进行编译...

我怎么可能没有得到 sizeof 的总和 9???? 我错过了什么???

最佳答案

结构中最大的元素有两个字节。它必须以可被 2 整除的偏移量对齐。

假设您的结构具有 sizeof == 9,那么如果您有这些结构的数组,则数组中的第二个元素将不会使其成员:wTotalLength 正确对齐。

例如:

Sizeof 是 9,你有一个结构数组 usbtmc_config_descriptor[2] 并且你从地址 0 开始。结构数组中的下一个元素来自地址 9。成员 wTotalLength 位于偏移量 +2 处,这使其地址为 11。未正确对齐。

usbtmc_config_descriptor[0] 的地址为 0

usbtmc_config_descriptor[1] 的地址是 9

usbtmc_config_descriptor[1].wTotalLength 的地址为 11

关于C sizeof(xx) 问题... ??? USB 设备描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26532457/

相关文章:

c - 中缀到后缀函数错误 : control may reach end of non-void function

c - 对 getprocessmemoryinfo@12 的 undefined reference

VB.NET 将 USB 转换为 RS232

java - 使用 Java Sound API 进行多 channel USB 录音?

delphi - 使用 3G 调制解调器调用语音电话

Cortex M3 上的 C 中断

c - 当我用Scite编译时,命令提示符不会出现,为什么?

c - OpenGL Sprite 映射不起作用

embedded - 在重置皮质 m3 上保留一些 RAM 值

arm - ARM (Cortex M3) 的应用程序内编程如何工作?