我是C ++菜鸟,我想知道如何从C ++函数返回一个数组 我尝试了以下代码,但似乎没有用。
char some_function(){
char my_string[] = "The quick brown fox jumps over the lazy dog";
return my_string;
}
答案 0 :(得分:5)
代码不起作用的原因是函数结束的时间,您创建的字符串的生命周期也是如此。相反,如果你打算在C ++中工作,请使用std::string
并返回。
std::string myFunc(){
return string("hey a new string");
}
对于其他数组,请使用std::vector
,std::deque
或其他一个STL类。我还要指出你看看STL(标准模板库):
vector<float> myFunc(){
vector<float> blah;
blah.push_back(4.5);
blah.push_back(5.7);
return blah;
}
返回数组:
指针等的大问题是对象生命周期的考虑。如下面的代码:
int* myFunc(){
int myInt = 4;
return &myInt;
}
这里发生的是当函数退出myInt
不再存在时,返回的指针指向某个内存地址,该地址可能包含也可能不包含4的值。如果要返回使用指针的数组(我真的建议你不要使用std::vector
)它必须看起来像:
int* myFunc(){
return new int[4];
}
使用new运算符。
答案 1 :(得分:2)
在C ++中,几乎在所有情况下,最好在std::string
数组上使用char
。
更一般地说,考虑STL container classes而不是C风格的数组。
以下是几个例子......
#include <string>
#include <vector>
std::string some_function()
{
return "The quick brown fox jumps over the lazy dog";
}
std::vector<std::string> some_other_function()
{
std::vector<std::string> stuff;
stuff.push_back("Spam");
stuff.push_back("Spam");
stuff.push_back("Spam");
stuff.push_back("Spam");
stuff.push_back("Spam");
stuff.push_back("Spam");
stuff.push_back("Spam");
return stuff;
}
答案 2 :(得分:1)
如果你可以使用标准容器,那么你应该。在您的具体示例中,您应使用的容器为std::string
,如:
#include <string>
std::string some_function(){
std::string my_string = "The quick brown fox jumps over the lazy dog";
return my_string;
}
另一方面,如果你真的需要传递一个实际的数组,你必须做更多的事情。很可能最好的选择是让调用者计算出数组的细节,然后将其作为参数传递给被调用者:这看起来像这样:
// notice here that we use 'string.h', with the '.h' extension, different from above
#include <string.h>
void some_function(size_t len, char * dest)
{
std::strncpy(dest, "The quick brown fox jumps over the lazy dog", len);
}
int main()
{
const std::size_t stringSize = 100;
char myString[stringSize];
some_function(stringSize, myString);
}
另一种选择,虽然在许多情况下甚至不太理想,但是分配一个新的存储区域来保存阵列。
char* some_function()
{
char* result = new char[44];
strcpy(result, "The quick brown fox jumps over the lazy dog");
return result;
}
int main()
{
char *myString = some_function();
// do some stuff with myString
delete myString[];
}
答案 3 :(得分:0)
由于内存模型,这会崩溃。
在C ++中(和许多其他语言一样),有两个流行的地方可以分配内存:堆栈和堆。
在C ++中,堆栈是一个特殊的内存区域,其中函数放置它们在执行期间所需的任何值。要记住的最重要的事情是,一旦函数返回,生命就会被删除。这意味着如果你返回一个指向堆栈上某个东西的指针,那么你的程序就会崩溃,因为它已经不存在了。如果您返回一个数组,那就是您要做的事情。
希望有一个数据永远存在的地方(“永远”是程序的持续时间):堆。如果在堆上分配了某些内容,则在函数返回时不会清除它。但是,它意味着额外的簿记,因为您很容易丢失对某个已分配内存块的所有引用;如果你这样做,就没有办法收回它(这被称为泄漏,这是一件非常糟糕的事情)。因此,提出了一条规则:如果函数在堆上分配内存,它应该负责释放它。问题是,如果你的函数返回分配的内存,它显然无法处理它。因此,您不应该在堆上分配内存并将其返回。
因此,如果您无法在堆栈上分配数组,并且无法在堆上返回指向内存的指针,那么您可以做什么?
我建议您使用C ++类型来解决您的问题。如果您要使用一组字符,最好是std::string
(#include <string>
)。如果您要使用其他任何数组,最好的可能是std::vector<YourTypeHere>
(#include <vector>
)。两者都管理自己的记忆,因此返回它们是安全的。
这里有很多关于Google和Google的文档。无论如何,这是一个快速的例子。
std::vector<int> foo()
{
std::vector<int> my_vector;
my_vector.push_back(1);
my_vector.push_back(2);
my_vector.push_back(3);
return my_vector;
}
std::string bar()
{
std::string my_string = "The quick brown fox jumps over the lazy dog";
return my_string;
}
int main()
{
std::vector<int> my_vector = foo();
// will print 123
std::cout << my_vector[0] << my_vector[1] << my_vector[2] << std::endl;
std::string my_string = bar();
// will print The quick brown fox jumps over the lazy dog
std::cout << my_string << std::endl;
}
答案 4 :(得分:0)
这是因为您尝试从函数调用返回的变量是一个临时变量,它是在堆栈中创建的,一旦控件从块中移出,堆栈变量就会被清除。因此,您返回的指针指向已删除的变量。
如果你想从函数返回一些东西,你可以传递一个函数地址并将变量放在该地址中
void some_function(string& some_string){
char my_string[] = "The quick brown fox jumps over the lazy dog";
some_string = my_string;
}
答案 5 :(得分:0)
没有STL,有两种方法可以做到这一点。一个是使用'out'参数,另一个是滥用结构。以下是第一部作品:
#include <cstddef> // For ::std::size_t
#include <cstring> // For strncpy
void some_function(char retval[], ::std::size_t retval_len) {
char my_string[] = "The quick brown fox jumps over the lazy dog";
::std::strncpy(retval, my_string, retval_len);
}
以下是第二种方法的工作原理:
struct array_struct {
char the_array[50];
};
array_struct some_function() {
array_struct ary = { "The quick brown fox jumps over the lazy dog" };
return ary;
}