title: Load config parameters on Arduino ESP8266
body: <p>I am using Arduino ESP8266 to store and load configuration settings on SPIFSS. I used this ConfigFile.ino as a reference example.</p>
  
  <p><a href="https://github.com/esp8266/Arduino/blob/master/libraries/esp8266/examples/ConfigFile/ConfigFile.ino" rel="nofollow">https://github.com/esp8266/Arduino/blob/master/libraries/esp8266/examples/ConfigFile/ConfigFile.ino</a></p>
  
  <p>This function loads the configuration settings onto variables <code>serverName</code> and <code>accessToken</code>.</p>
  
  <pre><code>bool loadConfig() {
    File configFile = SPIFFS.open("/config.json", "r");
    if (!configFile) {
      Serial.println("Failed to open config file");
      return false;
    }
  
    size_t size = configFile.size();
    if (size &gt; 1024) {
      Serial.println("Config file size is too large");
      return false;
    }
  
    // Allocate a buffer to store contents of the file.
    std::unique_ptr&lt;char[]&gt; buf(new char[size]);
  
    // We don't use String here because ArduinoJson library requires the input
    // buffer to be mutable. If you don't use ArduinoJson, you may as well
    // use configFile.readString instead.
    configFile.readBytes(buf.get(), size);
  
    StaticJsonBuffer&lt;200&gt; jsonBuffer;
    JsonObject&amp; json = jsonBuffer.parseObject(buf.get());
  
    if (!json.success()) {
      Serial.println("Failed to parse config file");
      return false;
    }
  
    const char* serverName = json["serverName"];
    const char* accessToken = json["accessToken"];
  
    // Real world application would store these values in some variables for
    // later use.
  
    Serial.print("Loaded serverName: ");
    Serial.println(serverName);
    Serial.print("Loaded accessToken: ");
    Serial.println(accessToken);
    return true;
  }
  </code></pre>
  
  <p>I made some modifications to this function to load the configuration settings into a struct.</p>
  
  <pre><code>struct ConfigSettingsStruct
  {
      String ssid;
      String password;
  };
  
  ConfigSettingsStruct ConfigSettings;
  
  bool loadConfig() {
      File configFile = SPIFFS.open("/config.json", "r");
      if (!configFile) {
          Serial.println("Failed to open config file");
          return false;
      }
  
      size_t size = configFile.size();
      if (size &gt; 1024) {
          Serial.println("Config file size is too large");
          return false;
      }
  
      // Allocate a buffer to store contents of the file.
      std::unique_ptr&lt;char[]&gt; buf(new char[size]);
  
      // We don't use String here because ArduinoJson library requires the input
      // buffer to be mutable. If you don't use ArduinoJson, you may as well
      // use configFile.readString instead.
      configFile.readBytes(buf.get(), size);
  
      StaticJsonBuffer&lt;200&gt; jsonBuffer;
      JsonObject&amp; json = jsonBuffer.parseObject(buf.get());
  
      if (!json.success()) {
          Serial.println("Failed to parse config file");
          return false;
      }
  
      //const char* serverName = json["serverName"];
      //const char* accessToken = json["accessToken"];
  
      char ssid_[30];
      strcpy(ssid_, json["ssid"]);
      ConfigSettings.ssid = String(ssid_);
  
      char password_[30];
      strcpy(password_, json["password"]);
      ConfigSettings.password = String(password_);
  
      // Real world application would store these values in some variables for
      // later use.
  
      Serial.print("Loaded ssid: ");
      Serial.println(ConfigSettings.ssid);
      Serial.print("Loaded password: ");
      Serial.println(ConfigSettings.password);
  
      return true;
  }
  </code></pre>
  
  <p>After I download the code and run ESP8266, the WiFi chip resets with some stack error. What is wrong with my code? How can the config settings be properly loaded onto <code>ConfigSettings</code>?</p>