使用 C 字符串会给出警告:“与返回的局部变量相关的堆栈内存地址”

新手上路,请多包涵

我不是 C 程序员,所以我对 C 字符串不是很熟悉,但现在我必须使用 C 库,所以这里是我的代码的缩短版本来演示我的问题:

 char** ReadLineImpl::my_completion () {
    char* matches[1];
    matches[0] = "add";

    return matches;
}

我收到此警告:

警告 - 返回与局部变量“匹配”相关的堆栈内存地址

而且我的程序似乎无法正常工作(可能是因为上面提到的警告)。

警告意味着什么?它会引起任何问题吗?

原文由 khajvah 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 409
1 个回答

变量 char* matches[1]; 在栈上声明,当当前块超出范围时会自动释放。

这意味着当您返回 matches 时,为 matches 保留的内存将被释放,并且您的指针将指向您不想要的东西。

您可以通过多种方式解决此问题,其中一些是:

  1. Declare matches[1] as static : static char* matches[1]; - this will allocate space for matches in the static space and not on the stack (this may bite如果您使用不当,因为 my_completion 函数的所有实例都将共享相同的 matches 变量)。

  2. 在调用函数中分配空间,并将其传递给 my_completion 函数: my_completion(matches)

    char* matches[1];
   matches = my_completion(matches);

   // ...

   char** ReadLineImpl::my_completion (char** matches) {
        matches[0] = "add";

        return matches;
   }

  1. 在堆上的被调用函数中分配空间(使用 malloccalloc 和朋友)并将所有权传递给调用函数,调用函数必须在不需要时释放这个空间更多(使用 free )。

原文由 Nemanja Boric 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题