如何在C ++函数中返回数组?

时间:2010-11-23 05:37:58

标签: c++

我是C ++菜鸟,我想知道如何从C ++函数返回一个数组 我尝试了以下代码,但似乎没有用。

char some_function(){
    char my_string[] = "The quick brown fox jumps over the lazy dog";
    return my_string;
}

6 个答案:

答案 0 :(得分:5)

代码不起作用的原因是函数结束的时间,您创建的字符串的生命周期也是如此。相反,如果你打算在C ++中工作,请使用std::string并返回。

std::string myFunc(){
    return string("hey a new string");
}

对于其他数组,请使用std::vectorstd::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;
}