2016-01-13 3 views
2

В этом примере я хочу вернуть int nums[40]
Как я могу это сделать?C++ возвращаемый тип от функции

<RETURNTYPE> test() 
{ 
    int nums[40]; 

    for (int i=0; i < 40; i++) 
    { 
     nums[i] = i + 1; 
    } 

    return nums; 
} 
+4

Также смотрите: http://stackoverflow.com/questions/8745260/c-return-array-from-function – NathanOliver

+2

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

+0

std :: vector в порядке, но я хочу 'int []' в примере. –

ответ

5

Вы не можете этого сделать. По нескольким причинам (включая историю и совместимость с C, а также правило, которое разбивает массивы на указатели в нескольких важных случаях) вы не можете вернуть необработанный массив; но вы можете вернуть struct (или class ....), содержащий этот массив.

Что вы можете сделать в C++ 11 - это вернуть std::array<int,40>; он ведет себя как ваша вещь, но это правильный класс (со всеми обычными операциями, которые вы себе представляете, и итераторами). Так что ваш код становится:

std::array<int,40> test(void) { 
    std::array<int,40> nums; 
    for (int i=0; i < 40; i++) { 
    nums[i] = i + 1; 
    } 
    return nums; 
} 

optimizing compiler (например, g++ -Wall -O2 -std=c++11 .... используя недавний GCC) оптимизируют, что точно так же как ваш гипотетический тип возвращаемого значения (или как FISOCPP's answer, который, вероятно, компилируются в тот же объект код).

Если размер (40) может изменяться во время выполнения, используйте std::vector<int> как тип и объявить std::vector> nums{40}; -Тогда вы позже могли nums.resize(17); и данные затем остаться в куче (так есть крошечная потеря производительности).

0

Необходимо динамически выделять память (сейчас она находится на стеке). Тип возврата будет int * then.

2

только Способ достижения этого заключается в том, чтобы инкапсулировать ваш массив в структуру (или объединение - что не имеет значения).

typedef struct { int ra[20]; } rvtyp; 

rvtyp test() 
{ 
    int nums[40]; 

    for (int i=0; i < 40; i++) 
    { 
     nums[i] = i + 1; 
    } 

    return *(rvtyp*)&nums; 
} 

Тогда вы можете получить доступ к возвращаемому значению с помощью 'test(). Ra'.

+0

Должен ли я освобождать после этого? Я имею в виду кучу или стек? –

+0

Это «стек». Кажется, что каждая переменная будет храниться там (вы должны проконсультироваться со стандартом ISO для получения конкретной информации). Однако вы можете иметь указатель на не-стек памяти (который часто питается вызовом функции). В нашем случае мы не возвращаем указатель, и внешняя функция не вызывается, поэтому вы можете предположить, что это стек. Поэтому внешняя работа не требуется для вызывающей функции. – AnArrayOfFunctions

+0

Спасибо. Ясно. –

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