首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C程序设计:结构初始化方式的不同

C程序设计:结构初始化方式的不同
EN

Stack Overflow用户
提问于 2022-02-25 05:33:53
回答 1查看 83关注 0票数 1

我有下面的代码可以工作

代码语言:javascript
复制
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
        },
    },
};

这次失败了

代码语言:javascript
复制
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;

但是,如果我改变到这种方式,它会起作用。

代码语言:javascript
复制
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));

使用{.}初始化和先声明变量,然后逐一分配其字段之间有什么区别?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-25 12:55:15

您的第一个memcpy失败有两个原因:

  1. strlen不计算字符串nul终止。因此,如果您的字符串是"abc",它只返回3,这不足以复制完整的字符串。您需要将+1添加到您的strlen结果中。

  1. wifi_config未初始化,这意味着字符串数组包含随机字符,在您的示例中,该字符串没有可能充当null的零值0

原因2也是为什么您的最后一个例子如预期的那样工作。使用初始化器时,未特别提到的字段将使用默认值初始化。对于整数类型数组,它们被初始化为零。因此,即使您的memcpy无法复制nul终止,也已经存在零字节,这将达到相同的目的。

我建议您始终至少将变量初始化为零:

代码语言:javascript
复制
wifi_config_t wifi_config = {0}; // Set all fields to 0, NULL or NaN.
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71261469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档