如何从函数中正确返回数组?

时间:2012-02-07 14:37:22

标签: c++ arrays

我想创建一个返回数组的函数(在项目中)。我不太确定我该怎么做。

int worker::*codebook(UnitType type){
    int  code[12]; 
    if  (type == UnitTypes::center){
        int temp[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
        code=temp;
    }
    return code;
}

其中worker是类,unitType是枚举。我在头文件中定义函数如下:

int *codebook(UnitType type);

我的问题如下:

cannot convert from 'int' to 'int Worker::*

对此有何看法?

8 个答案:

答案 0 :(得分:5)

代码中的第一个问题是语法。签名应该是:

 int* worker::codebook(UnitType type)

然后,它分配给一个数组:

code=temp;

语言不允许这样做。

最后,它返回一个指向局部变量的指针:

return code;

当函数返回时,数组将不再存在,因此任何从外部使用它的尝试都将导致未定义的行为。

现在,回答主要问题,如何从函数中正确返回数组?

一种选择是使用std::vector

 std::vector<int> worker::codebook(UnitType type) {
     std::vector<int> code(12); // vector with 12 zeros
     if  (type == UnitTypes::center){
         code[11] = 1;
     }
     return code;
 } 

另一种方法是使用std::array

 std::array<int, 12> worker::codebook(UnitType type) {
     std::array<int, 12> code = {{}};
     if  (type == UnitTypes::center){
         code[11] = 1;
     }
     return code;
 }

答案 1 :(得分:2)

您无法返回本地数组,当函数退出时,它将超出范围。

最好使用实际的数据结构,例如std::vector。如果你想使用裸C级数组,你必须动态分配内存并为函数添加一种表达数组长度的方法,也许也可以使用size_t& length参数。

答案 2 :(得分:2)

你在函数原型中有错误:

int worker::*codebook(UnitType type){

应该是

int* worker::codebook(UnitType type){

这是不正确的,因为code在堆栈上分配并在超出范围时被破坏。

您应该在堆上分配此code数组。这个函数的主体可能如下所示:

int* code = new int[12]; 

if  (type == UnitTypes::center){

    int temp[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
    memcpy(code, temp, 12*sizeof(int));
}
return code;

但是当调用者完成此数组时,调用者应该调用delete[]

int* array = codebook(type);
delete[] array;

丑陋的内存管理与这种解决方案相关联。由于您使用的是C ++,因此您应该使用一些使其更容易的对象(例如std::vector)。

希望这有帮助。

答案 3 :(得分:1)

签名应为:

int* worker::codebook(UnitType type)

请注意,您遇到了未定义的行为。

int  code[12]; 

是一个局部变量,当函数退出时会被销毁。而你正在归还它。永远不要这样做。您应该通过new动态分配数组。

答案 4 :(得分:0)

这应该是int* worker::codebook(UnitType type)*int一致,使其成为指向intint*)的指针。

但是,你真的不希望return code这样 - 当函数退出时,code将指向垃圾(因为它是在堆栈上分配的

答案 5 :(得分:0)

您的指针声明位置错误。

 int* worker::codebook(UnitType type)

但是,请注意,您正在堆栈上创建数组,当您的函数退出时,该数组将被销毁。您需要使用new在堆上创建它,并在完成后记住delete

答案 6 :(得分:0)

你不想这样做,因为这里数组内存在函数内部分配,并在函数完成时消失。在内存/数组中分配函数,并在其中一个参数中将数组作为指针传递。

答案 7 :(得分:0)

您可以将数组埋入结构中,然后按值返回结构 - 经典C样式:

struct my_array
{
int code[12];
};

my_array worker::codebook(UnitType type){
    my_array arr = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; 
    if  (type == UnitTypes::center){
       arr.code[11] = 1;
    }
    return arr;
}