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

时间:2017-07-27 10:42:39

标签: c memory struct esp8266

我正在使用esp8266,非操作系统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. struct fields或它们的第一个成员(如果它们是数组)
  2. 整个结构作为uint8_t数组
  3. 我发现的是:

      通道和authmode之间的
    1. 总是[ 0x2 0x3 ]
    2. 在authmode和ssid_hidden之间总是[ 0x0 0x0 0x0 ]
    3. 完全适合有五个额外的字节,这解释了尺寸。就我测试而言,这些字节与struct字段值保持一致。

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

      有关

1 个答案:

答案 0 :(得分:2)

您的错误有两方面:

  1. 您不强制编译器使用短枚举,可能使用an option like -fshort-enums,因此在您的情况下4可以自由使用“自然”大小,如int。同时,对齐也是4而不是1。
  2. uint16可能已经有2的对齐,所以即使枚举的大小和对齐为1,除非你使用a compiler-specific extension to pack that struct而不管对齐约束,否则大小至少为104。