结构未按预期存储在内存中
Struct not stored in memory as expected
我正在使用 esp8266,非 OS SDK。
我想了解 softap_config 结构是如何存储在内存中的。这样做的原因是我计划通过 UDP 实现配置 espressif,我宁愿按原样发送整个结构,然后只 memcpy 它。
来自user_interface.h:
struct softap_config {
uint8 ssid[32];
uint8 password[64];
uint8 ssid_len; // Note: Recommend to set it according to your ssid
uint8 channel; // Note: support 1 ~ 13
AUTH_MODE authmode; // Note: Don't support AUTH_WEP in softAP mode.
uint8 ssid_hidden; // Note: default 0
uint8 max_connection; // Note: default 4, max 4
uint16 beacon_interval; // Note: support 100 ~ 60000 ms, default 100
};
typedef enum _auth_mode {
AUTH_OPEN = 0,
AUTH_WEP,
AUTH_WPA_PSK,
AUTH_WPA2_PSK,
AUTH_WPA_WPA2_PSK,
AUTH_MAX
} AUTH_MODE;
所以,我做的第一件事是:
os_printf("size in mem: %d\n", sizeof(struct softap_config));
我得到了 108 而不是预期的 103.
然后我继续打印十六进制值:
- 结构字段或其第一个成员(如果它们是数组)
- 整个结构作为一个uint8_t数组
我发现的是:
- 通道和授权模式之间总是有 [0x2 0x3]
- 在 authmode 和 ssid_hidden 之间总是有 [0x0 0x0 0x0]
非常适合有五个额外的字节,这解释了大小。据我测试,这些字节独立于结构字段值而保持不变。
但为什么会这样呢?这些值意味着什么?
我想这与 AUTH_MODE?
有关
你的错误是双重的:
- 您不强制编译器使用短枚举,可能与 an option like
-fshort-enums
一起使用,因此可以自由使用 "natural" 大小,如 int
,你的情况 4.伴随,对齐也是 4 而不是 1.
uint16
可能已经具有 2 的对齐方式,因此即使枚举的大小和对齐方式为 1,大小也至少为 104,除非您使用 a compiler-specific extension to pack that struct 而不管对齐约束。
我正在使用 esp8266,非 OS SDK。
我想了解 softap_config 结构是如何存储在内存中的。这样做的原因是我计划通过 UDP 实现配置 espressif,我宁愿按原样发送整个结构,然后只 memcpy 它。
来自user_interface.h:
struct softap_config {
uint8 ssid[32];
uint8 password[64];
uint8 ssid_len; // Note: Recommend to set it according to your ssid
uint8 channel; // Note: support 1 ~ 13
AUTH_MODE authmode; // Note: Don't support AUTH_WEP in softAP mode.
uint8 ssid_hidden; // Note: default 0
uint8 max_connection; // Note: default 4, max 4
uint16 beacon_interval; // Note: support 100 ~ 60000 ms, default 100
};
typedef enum _auth_mode {
AUTH_OPEN = 0,
AUTH_WEP,
AUTH_WPA_PSK,
AUTH_WPA2_PSK,
AUTH_WPA_WPA2_PSK,
AUTH_MAX
} AUTH_MODE;
所以,我做的第一件事是:
os_printf("size in mem: %d\n", sizeof(struct softap_config));
我得到了 108 而不是预期的 103.
然后我继续打印十六进制值:
- 结构字段或其第一个成员(如果它们是数组)
- 整个结构作为一个uint8_t数组
我发现的是:
- 通道和授权模式之间总是有 [0x2 0x3]
- 在 authmode 和 ssid_hidden 之间总是有 [0x0 0x0 0x0]
非常适合有五个额外的字节,这解释了大小。据我测试,这些字节独立于结构字段值而保持不变。
但为什么会这样呢?这些值意味着什么? 我想这与 AUTH_MODE?
有关你的错误是双重的:
- 您不强制编译器使用短枚举,可能与 an option like
-fshort-enums
一起使用,因此可以自由使用 "natural" 大小,如int
,你的情况 4.伴随,对齐也是 4 而不是 1. uint16
可能已经具有 2 的对齐方式,因此即使枚举的大小和对齐方式为 1,大小也至少为 104,除非您使用 a compiler-specific extension to pack that struct 而不管对齐约束。