我正在写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]
的地址为0usbtmc_config_descriptor[1]
的地址是9usbtmc_config_descriptor[1].wTotalLength
的地址是11
关于c - C sizeof(xx)问题…??? USB设备描述符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26532457/