函数返回枚举数组

时间:2012-08-25 18:42:25

标签: c++ arrays pointers return

我需要一个返回枚举数组的方法,我试过了:

note_name *AppSettings::getNoteMap(){
    note_name notes[] = {..}
}

我在某处读到了我应该返回数组第一个元素的地址,所以这就是为什么有一个指针。这给了我一个警告:address of stack memory associated with local variable notes returned

如何摆脱警告并正确返回数组?

4 个答案:

答案 0 :(得分:3)

您无法从函数句点返回数组。你可以返回一个指向动态分配的内存块的指针(我不会去这条路径),或者将一个指针(连同大小)作为输出参数,或者返回指向静态数组的指针,或者返回一个{ {1}}或其他一些集合。

我会使用vector<T>std::vector

std::array

答案 1 :(得分:1)

使用std::vectorstd::array,其他一些集合或dynamic-array(即使用new,而不是在堆栈上进行分配),因为从函数范围退出后您的数组将被销毁,你将有指针,指向内存中的一些垃圾。我想您知道enum中有多少值,如果您有C ++ 11,则可以使用std::array

std::array<note_name> foo() {
   std::array<note_name, size> ret = { ... }; // fill ret, instead of ...
   return ret;
}

答案 2 :(得分:1)

要这样做,您需要动态分配数组并返回相应调用返回的指针new。您不能返回指向函数本地变量的指针,因为它将在函数退出后停止存在。使用new将确保在函数退出后内存在堆上。在使用C ++时,使用std::vector可以更好地服务,并使函数返回向量的实例

答案 3 :(得分:0)

让我们来看看你写的内容:

note_name *AppSettings::getNoteMap(){
    note_name notes[] = {..}
}

数组notes是一个局部变量,在函数返回时会自动清理。如果返回指向它的指针,那么您将返回一个指向不再存在的数组的指针。这就是编译器抱怨的原因。

如果在编译时已知数组的大小和内容,则声明数组static const。然后您可以返回对数组的引用。语法有点奇怪:

static const std::size_t note_names_size = 42;
note_name const (&AppSettings::getNoteMap())[note_names_size] {
    static note_name const notes[note_names_size] = { ... };
    return notes;
}

如果在编译时已知数组的大小,而不是内容,则使用std::array。您可以声明一个局部变量,填入它,然后通过 value 返回它。

如果阵列的大小和内容在编译时已知(或者如果您的库未实现std::array),请改用std::vector。< / p>

相关问题