【问题标题】:Is it safe returning Arduino String from a C function?从 C 函数返回 Arduino 字符串是否安全?
【发布时间】:2021-11-12 10:11:36
【问题描述】:

在为多个片上系统微控制器提供的软件中,我发现了这段代码

String getMacAddress() {
  uint8_t baseMac[6];
  char baseMacChr[13] = {0};
#  if defined(ESP8266)
  WiFi.macAddress(baseMac);
  sprintf(baseMacChr, "%02X%02X%02X%02X%02X%02X", baseMac[0], baseMac[1], baseMac[2], baseMac[3], baseMac[4], baseMac[5]);
#  elif defined(ESP32)
  esp_read_mac(baseMac, ESP_MAC_WIFI_STA);
  sprintf(baseMacChr, "%02X%02X%02X%02X%02X%02X", baseMac[0], baseMac[1], baseMac[2], baseMac[3], baseMac[4], baseMac[5]);
#  else
  sprintf(baseMacChr, "%02X%02X%02X%02X%02X%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
#  endif
  return String(baseMacChr);
}

String 由 Arduino 上下文提供。那么在那些微控制器上,这段代码安全吗?

我知道返回变量的范围/寿命存在问题(这里很好解释:Returning a C string from a function),大多数人使用std::string,但我在上下文中没有任何经验微控制器,因为我已经看到它使用了很多,所以我想出了这个问题。

我没有找到任何关于它的文档,欢迎提供所有额外信息。

【问题讨论】:

    标签: c++ arduino arduino-c++


    【解决方案1】:

    arduino 中的 String 类不存储指向字符的指针,而是将其复制到其内部存储器中。

    从函数返回 String 时,复制构造函数会负责其余的工作。

    所以是的,它是安全的

    【讨论】:

      【解决方案2】:

      返回 Arduino 字符串是否安全

      是的。 String 管理它的内存。

      来自 C 函数?

      嗯,它不是“C 函数”,它是 C++ 中的普通函数。

      大多数人都使用 std::string 但我在微控制器方面没有任何经验

      差别不大,也可以在esp上使用std::string

      String 和 Arduino 的其他类似接口可以节省内存(使用 realloc,而不是调整大小时的 delete+new)并更容易与 Arduino 特定的东西交互(使用 __FlashStringHelper 的构造函数)。它旨在“模仿”std::string 一些 Arduino 或嵌入式特定行为。

      【讨论】:

        【解决方案3】:

        对我来说看起来不错,因为您正在将调用者中具有自动存储持续时间的字符串分配给函数。

        但请检查它们是否足够大 - 您需要查阅函数文档。

        对于return String(baseMacChr);baseMacChr 在概念上不会超出范围,直到函数} 关闭getMacAddress,所以这也是安全的。

        如果您可以使用std::string 而不是String,那就更好了。每个 C++ 程序员都确切地知道前者是什么。使用String(不管是什么)只会增加混乱。

        【讨论】:

          猜你喜欢
          • 2011-01-23
          • 2014-11-06
          • 1970-01-01
          • 2011-05-29
          • 1970-01-01
          • 2013-03-25
          相关资源
          最近更新 更多