结构未按预期存储在内存中

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.

然后我继续打印十六进制值:

  1. 结构字段或其第一个成员(如果它们是数组)
  2. 整个结构作为一个uint8_t数组

我发现的是:

  1. 通道和授权模式之间总是有 [0x2 0x3]
  2. 在 authmode 和 ssid_hidden 之间总是有 [0x0 0x0 0x0]

非常适合有五个额外的字节,这解释了大小。据我测试,这些字节独立于结构字段值而保持不变。

但为什么会这样呢?这些值意味着什么? 我想这与 AUTH_MODE?

有关

你的错误是双重的:

  1. 您不强制编译器使用短枚举,可能与 an option like -fshort-enums 一起使用,因此可以自由使用 "natural" 大小,如 int,你的情况 4.伴随,对齐也是 4 而不是 1.
  2. uint16 可能已经具有 2 的对齐方式,因此即使枚举的大小和对齐方式为 1,大小也至少为 104,除非您使用 a compiler-specific extension to pack that struct 而不管对齐约束。