我正在写USB设备固件。。。我有以下结构类型定义

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将字符串打印到超级终端,然后再打印出一个易于使用的字符串。。。
以下是对那些认为这很重要的人的全部方法
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代码源工具的SoftConsole进行编译。。。
我怎么可能拿不到总共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 - C sizeof(xx)问题…??? USB设备描述符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26532457/

10-15 02:07