如何使用malloc从函数返回C字符串

时间:2017-02-10 21:11:58

标签: c++ string malloc c-strings

我正在尝试从函数返回一个C字符串。该函数假设用逗号连接3个整数并将结果作为char数组返回,但是我得到了垃圾值。我假设我没有正确地调用malloc。有人可以就问题的原因提出建议吗?

using namespace std;

const char * createCommand(int p1, int p2, int p3){
    stringstream sstm;
    std::string comma = ",";
    sstm << p1 << comma << p2 << comma << p3;
    std::string str = sstm.str();
    const char *cstr = (const char *)malloc( (str.length()+1) * sizeof (char));

    cstr = str.c_str();
    return cstr;    
}

int main() {
    const char *cstr2 = createCommand(1,0,250); //I want to return "1,0,250"
    printf("char = %s\n",cstr2);
}

3 个答案:

答案 0 :(得分:2)

由于其他两个答案已经回应了处理文字问题的问题,我将建议我考虑一个非常重要的设计缺陷导致你的问题:返回c字符串。

在您提供的示例代码中,完全使用c-strings是没有意义的。以下代码将实现您打算执行的操作,没有任何困难或有问题的代码:

std::string createCommand(int p1, int p2, int p3){
    std::stringstream sstm;
    std::string comma = ",";
    sstm << p1 << comma << p2 << comma << p3;
    return sstm.str();
}

int main() {
    std::string command = createCommand(1,0,250); //I want to return "1,0,250"
    std::cout << "char = " << command << "\n";
}

即使您只使用printf而不是C ++ iostreams库,这个设计仍然更好:

std::string createCommand(int p1, int p2, int p3){
    std::stringstream sstm;
    std::string comma = ",";
    sstm << p1 << comma << p2 << comma << p3;
    return sstm.str();
}

int main() {
    std::string command = createCommand(1,0,250); //I want to return "1,0,250"
    printf("char = %s\n", command.c_str());
}

如果你需要将c-string传递给一些较旧的基于C的库,这个设计仍然可以满足要求。关键是,除了通过字符串本身之外,没有理由使用malloc或与底层c字符串表示接口。

答案 1 :(得分:1)

std::string和其他对象起作用的赋值运算符不能覆盖指针。因此,分配

cstr = str.c_str();

泄漏已分配的内存,并用字符串中的数据替换指针。此外,函数现在返回的指针指向退出函数时失效的内存,除了泄漏外还会创建一个未定义的行为。

要解决此问题,请致电std::strcpy(cstr, str.c_str());不要忘记在通话结果上拨打std::free修改:您应该从const函数的返回类型中删除createCommand(WhozCraig,感谢您的评论)。

注意:我认为这只是使用malloc的练习,您知道使用new[]是首选,而且您不必这样做如果您可以从函数返回std::string,则可以使用上述任何一项。

答案 2 :(得分:0)

在返回指针之前,您需要使用某种形式的strcpy复制字符串。

const char * createCommand(int p1, int p2, int p3){
    stringstream sstm;
    std::string comma = ",";
    sstm << p1 << comma << p2 << comma << p3;
    std::string str = sstm.str();
    const char *cstr = (const char *)malloc( (str.length()+1) * sizeof (char));

    strcpy(cstr, str.c_str());
    return cstr;    
}
相关问题