C编程:结构初始化方式的区别
C programming: Differences between structure initialization way
我有以下有效的代码
wifi_config_t wifi_config = {
.sta = {
.ssid = EXAMPLE_ESP_WIFI_SSID,
.password = EXAMPLE_ESP_WIFI_PASS,
.threshold.authmode = WIFI_AUTH_WPA2_PSK,
.pmf_cfg = {
.capable = true,
.required = false
},
},
};
而这个失败了
wifi_config_t wifi_config;
memcpy(wifi_config.sta.ssid, ssid, strlen((const char*) ssid));
memcpy(wifi_config.sta.password, password, strlen((const char*) password));
wifi_config.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK,
wifi_config.sta.pmf_cfg.capable = true;
wifi_config.sta.pmf_cfg.required = false;
但是,如果我改成这种方式,就可以了
wifi_config_t wifi_config = {
.sta = {
.threshold.authmode = WIFI_AUTH_WPA2_PSK,
.pmf_cfg = {
.capable = true,
.required = false
},
},
};
memcpy(wifi_config.sta.ssid, ssid, strlen((const char*) ssid));
memcpy(wifi_config.sta.password, password, strlen((const char*) password));
使用{...}初始化和先声明变量,然后一个一个赋值给它的字段有什么区别?
您的第一个 memcpy
失败有两个原因:
strlen
不计算字符串 nul 终止。所以如果你的字符串是"abc"
,它只有returns 3,这不足以复制完整的字符串。您需要将 +1
添加到 strlen
结果中。
wifi_config
未初始化,这意味着您的字符串数组包含随机字符,在您的情况下没有零值 0
可能充当空值。
原因 2 也是您最后一个示例按预期工作的原因。 当你使用初始化器时,你没有特别提到的字段会被初始化为默认值。在整数类型数组的情况下,它们被初始化为零。因此,即使您的 memcpy
无法复制 nul 终止符,也已经有零字节可以达到相同的目的。
我建议您始终至少对变量进行零初始化:
wifi_config_t wifi_config = {0}; // Set all fields to 0, NULL or NaN.
我有以下有效的代码
wifi_config_t wifi_config = {
.sta = {
.ssid = EXAMPLE_ESP_WIFI_SSID,
.password = EXAMPLE_ESP_WIFI_PASS,
.threshold.authmode = WIFI_AUTH_WPA2_PSK,
.pmf_cfg = {
.capable = true,
.required = false
},
},
};
而这个失败了
wifi_config_t wifi_config;
memcpy(wifi_config.sta.ssid, ssid, strlen((const char*) ssid));
memcpy(wifi_config.sta.password, password, strlen((const char*) password));
wifi_config.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK,
wifi_config.sta.pmf_cfg.capable = true;
wifi_config.sta.pmf_cfg.required = false;
但是,如果我改成这种方式,就可以了
wifi_config_t wifi_config = {
.sta = {
.threshold.authmode = WIFI_AUTH_WPA2_PSK,
.pmf_cfg = {
.capable = true,
.required = false
},
},
};
memcpy(wifi_config.sta.ssid, ssid, strlen((const char*) ssid));
memcpy(wifi_config.sta.password, password, strlen((const char*) password));
使用{...}初始化和先声明变量,然后一个一个赋值给它的字段有什么区别?
您的第一个 memcpy
失败有两个原因:
strlen
不计算字符串 nul 终止。所以如果你的字符串是"abc"
,它只有returns 3,这不足以复制完整的字符串。您需要将+1
添加到strlen
结果中。wifi_config
未初始化,这意味着您的字符串数组包含随机字符,在您的情况下没有零值0
可能充当空值。
原因 2 也是您最后一个示例按预期工作的原因。 当你使用初始化器时,你没有特别提到的字段会被初始化为默认值。在整数类型数组的情况下,它们被初始化为零。因此,即使您的 memcpy
无法复制 nul 终止符,也已经有零字节可以达到相同的目的。
我建议您始终至少对变量进行零初始化:
wifi_config_t wifi_config = {0}; // Set all fields to 0, NULL or NaN.