如何从函数返回char数组?

时间:2011-04-14 08:33:14

标签: c++ arrays function return

我尝试了以下内容:

char[10] testfunc()
{
    char[10] str;

    return str;
}

6 个答案:

答案 0 :(得分:40)

最好作为输出参数:

void testfunc(char* outStr){
  char str[10];
  for(int i=0; i < 10; ++i){
    outStr[i] = str[i];
  }
}

调用
int main(){
  char myStr[10];
  testfunc(myStr);
  // myStr is now filled
}

答案 1 :(得分:14)

您必须意识到char[10]char*相同。你实际上是在返回指针。现在指针指向一个变量(str),一旦退出函数就会被销毁,所以指针指向......什么都没有!

通常在C中,在这种情况下显式分配内存,当函数结束时不会被销毁:

char* testfunc()
{
    char* str = malloc(10 * sizeof(char));
    return str;
}

请注意! str所指向的记忆现在永远不会被破坏。这被称为“内存泄漏”。完成后,请务必free()内存:

foo = testfunc();
// do something with your foo
free(foo); 

答案 2 :(得分:11)

当您使用C ++时,可以使用std::string

答案 3 :(得分:7)

char *返回一个char数组,但是你编写的函数不起作用,因为你返回一个自动变量,当函数退出时它会消失。 使用这样的东西:

char *testfunc() {
    char* arr = malloc(100);
    strcpy(arr,"xxxx");
    return arr;
}

当然,如果你在C语义中返回一个数组,而不是std ::或boost ::或其他东西。 如评论部分所述: 记得从呼叫者那里释放内存。

答案 4 :(得分:4)

使用Boost:

boost::array<char, 10> testfunc()
{
    boost::array<char, 10> str;

    return str;
}

无法从函数返回正常char[10](或任何其他数组)。

答案 5 :(得分:0)

当你在函数内创建在堆栈中创建的局部变量时,在退出函数时很可能会在内存中被覆盖。 所以在大多数c ++实现中这样的代码都不起作用:

char[] pupulateChar()
{
    char* ch = "wonet return me";
    return ch;
}

修复是创建想要在函数外部填充的变量或要使用它的位置,然后将其作为参数传递并操作函数,例如:

void populateChar(char* ch){
    strcpy(ch,"fill me will, this will stay",size); // this will work as long it won overflow it. 
}
int main(){
    char ch[100]; // reserve memory in stack outside the function
    populateChar(ch); //populate array
}

c ++ 11解决方案使用std :: move(ch)将左值转换为rvalues

void populateChar(char* && fillme){
    fillme = new char[20];
    strcpy(fillme, "this worked for me");
}
int main(){
    char* ch;
    populateChar(std::move(ch));
    return 0;
}

或c ++ 11中的此选项:

char* populateChar(){
    char* ch = "test char";
    // will change from lvalue to r value
    return std::move(ch);
}
int main(){
    char* ch = populateChar();
    return 0;
}