我正在编写 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/