【问题标题】:How to return a const char* from a function after modifying it in c++?在 c++ 中修改函数后如何从函数返回 const char*?
【发布时间】:2021-11-23 16:15:00
【问题描述】:

我有一个函数,它接受一个 const char* 并向它添加一个数字:

const char* CheckName(const char* name, int number) {

        std::string s = std::to_string(number);
        std::string s1(name);
        const char* c = (s1+s).c_str();

        return c;
    }

但是这个函数只返回垃圾,因为指针 c 是悬空的。有什么办法可以重写那个函数吗? 提前致谢。

【问题讨论】:

  • 您必须将数据复制到超出功能范围的存储中,例如分配给new。最好像答案建议的那样返回std::string

标签: c++ char


【解决方案1】:

s1 + 1(临时)在使用它的语句末尾超出范围。因此,c 处于悬空状态,甚至在您从 CheckName 返回之前。

没有安全的方法可以从此函数返回const char *。改为返回 std::string(应该声明为 const)。

【讨论】:

    【解决方案2】:

    正如您所怀疑的,这个函数的问题在于它返回了一个指向无效位置的指针。这是因为您返回了内部保存在 (s1 + s) 字符串中的指针,该指针在函数内部声明,一旦函数返回并且其数据不再有效,就会超出范围。

    最好的解决方案是 Paul Sanders 建议的,即返回一个字符串:

    std::string CheckName(const char* name, int number) {
        return std::string(name) + std::to_string(number);
    }
    

    如果您需要保留基于指针的函数,解决方案是采用C风格的方法,如

    void CheckName(char* result, const char* name, int number) {
        std::string result_str = std::string(name) + std::to_string(number);
        std::memcpy(result, result_str.c_str(), result_str.size());
    } 
    

    这迫使您在调用函数中声明result 数组,这意味着您应该事先知道它的大小(或大小的上限)。

    如果您无法事先知道结果大小并且仍然需要使用指针,您的其他解决方案是在CheckName() 内分配new,但这是危险/糟糕的领域我建议不要这样做。

    【讨论】:

      猜你喜欢
      • 2012-02-18
      • 1970-01-01
      • 2012-02-27
      • 2016-06-10
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      相关资源
      最近更新 更多