首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从函数返回char数组时崩溃。

从函数返回char数组时崩溃。
EN

Stack Overflow用户
提问于 2021-04-26 20:45:43
回答 2查看 434关注 0票数 1

一个自由人和我一起在一个ESP32网络服务器上工作,我们碰壁了。我的伙伴几乎放弃了,而我没有他那么熟练。

我们有以下函数,它们编译得很好,但会导致ESP32崩溃。经过大量调试,我很确定在尝试返回c时会发生崩溃

代码语言:javascript
复制
void handle_logs_view(String path){
    char** list = sdcard_list_files(path);
    for (int i=0;list[i]!=NULL;i++){
        Serial.println(list[i]);
    }
}

char** sdcard_list_files(String path){
  Serial.println("Listing files for "+path);
  if (path.compareTo("/")){
      char* c[]={"dir1","file1.log","file2.log","file3.log","file4.log","file5.log",NULL};
      return c;
  }
  return NULL;
}
#endif

异常解码器的结果如下:

代码语言:javascript
复制
PC: 0x400d1d1b: handle_logs_view(String) at C:\Users\MickW\Downloads\Front_End-11_create_file_explorer\Front_End-11_create_file_explorer\sample_code\WIFITest/WIFITest.ino line 45
EXCVADDR: 0x00000000

Decoding stack results
0x400d1d1b: handle_logs_view(String) at C:\Users\MickW\Downloads\Front_End-11_create_file_explorer\Front_End-11_create_file_explorer\sample_code\WIFITest/WIFITest.ino line 45
0x400d1e7e: std::_Function_handler   >::_M_invoke(const std::_Any_data &) at C:\Users\MickW\AppData\Local\Temp\arduino_build_351256\sketch\WebServer.cpp line 32
0x400d68ff: std::function ::operator()() const at c:\users\mickw\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-97-gc752ad5-5.2.0\xtensa-esp32-elf\include\c++\5.2.0/functional line 2271
0x400d69a5: FunctionRequestHandler::handle(WebServer&, HTTPMethod, String) at C:\Users\MickW\Documents\Arduino\hardware\espressif\esp32\libraries\WebServer\src\detail/RequestHandlersImpl.h line 45
0x400d6a12: WebServer::_handleRequest() at C:\Users\MickW\Documents\Arduino\hardware\espressif\esp32\libraries\WebServer\src\WebServer.cpp line 633
0x400d6b8d: WebServer::handleClient() at C:\Users\MickW\Documents\Arduino\hardware\espressif\esp32\libraries\WebServer\src\WebServer.cpp line 314
0x400d1d6e: loop() at C:\Users\MickW\Downloads\Front_End-11_create_file_explorer\Front_End-11_create_file_explorer\sample_code\WIFITest/WIFITest.ino line 22
0x400d8ad5: loopTask(void*) at C:\Users\MickW\Documents\Arduino\hardware\espressif\esp32\cores\esp32\main.cpp line 23
0x40089552: vPortTaskWrapper at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/freertos/port.c line 143

这是来自espressif网站:

LoadProhibited,StoreProhibited

此CPU异常发生在应用程序试图从无效内存位置读取或写入无效内存位置时。写入/读取的地址在寄存器转储的EXCVADDR寄存器中找到。如果此地址为零,则通常意味着应用程序试图取消引用空指针。

如果有任何帮助或建议,我会很高兴的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-26 20:49:14

您正在返回指向自动(即基于堆栈的)变量的指针。当sdcard_list_files返回时,该变量就会消失,使指针‘悬空’。

一种解决方案是将c声明为static。另一个(在C++中)是返回一个std::optional <std::array<std::string>, 6>>

票数 4
EN

Stack Overflow用户

发布于 2021-04-26 20:53:30

c应该声明为static,最好是在代码的顶层。在您的示例中,c在堆栈上声明,并将在sdcard_list_files()返回时消失。使用c属性声明static将修复这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67273591

复制
相关文章

相似问题

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