我尝试了以下内容:
char[10] testfunc()
{
char[10] str;
return str;
}
答案 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;
}