2010-10-30 4 views
3

Возможно ли иметь функцию, которая возвращает массив переменной величины? Мой план состоит в том, чтобы размер возвращаемого массива был первым элементом массива (поэтому ret_val [0] = # членов в ret_val).Инициализация массива неизвестного размера

Затем возникает проблема с инициализацией массива возвращаемым значением этой функции. int moves[] = target_function() не собирался компилироваться.

+7

Почему бы не использовать 'std :: vector'? – kennytm

+0

Согласен, используйте std :: vector - вот для чего он нужен. – Puppy

+0

Размер переменных массива в C++ должен быть известен во время компиляции. Нет никакого способа, чтобы массив в стеке мог быть инициализирован из некоторого размера переменной runtime. Кенни прав, вот для чего «вектор». –

ответ

2

Вы можете вернуть указатель вместо массива:

int* moves = target_function(); 

Но не возвращают указатель на то, что вы создали на стеке, как он будет выходить за рамки, когда функция возвращает. Вы можете динамически выделять массив в куче.

+0

Извините, но я -1 плохая практика. Функция должна возвращать 'std :: vector'. – GManNickG

0

Такой массив не может быть автоматической переменной. Он должен быть указателем на динамически созданный массив, как сказал Марк.

+1

Больше комментария, чем ответа. – GManNickG

0

Короткий ответ заключается в том, что вы не можете вернуть массив. Вы можете вернуть указатель на динамически распределяемой памяти, хотя:

int* moves = target_function(); 
// do stuff with moves 
delete[] moves; 

target_function() придется использовать new выделить память.

Обратите внимание, что это не идеально с точки зрения управления памятью, так как легко забыть вызвать delete[] на возвращаемом массиве. Вместо этого рассмотрите вопрос о возврате std::vector<int>.

1

Я бы предложил не использовать такие хаки. Для вас используется std :: vector. Если вы действительно хотите, чтобы идти по этому пути, вот код, который делает то, что вы хотите:

int *allocate(int size) 
{ 
    int *res = new int[size]; 
    res[0] = size; 
    return res; 
} 


// Prints "Yes, it's 42": 
int *myArray = allocate(42); 
if (myArray[0] == 42) 
    std::cout << "Yes, it's 42!" << std::endl; 
1

Обычно вы будете использовать указатель на динамически выделенный массив:

int* target_function() { 
    int result* = new int[123]; 
    result[0] = 123; 
    return result; 
} 

int *moves = target_function(); 
std::cout << moves[0] << " moves" << std::endl; 

Это, как говорится, как правило, это более практичен и менее подвержен ошибкам использовать стандартный контейнер библиотеки, например, std::vector<int>. В C++ это в основном всегда лучший выбор, чем необработанный массив.

7

Каждый говорит вам использовать вектор, но никто не показывает вам, как это сделать. Вот так:

#include <vector> 

std::vector<int> target_function(int size) 
{ 
    std::vector<int> v(size); 
    v[0] = size; 
    return v; 
} 

int main() 
{ 
    std::vector<int> moves = target_function(my_favorite_int); 
} 
+0

Спасибо, +1 за то, что просто предложил вектор вместо этого битого вокруг куста. Какой смысл говорить «Вот код. О, кстати, это плохой код, не используйте его».? – GManNickG

Смежные вопросы