В этом примере я хочу вернуть int nums[40]
Как я могу это сделать?C++ возвращаемый тип от функции
<RETURNTYPE> test()
{
int nums[40];
for (int i=0; i < 40; i++)
{
nums[i] = i + 1;
}
return nums;
}
В этом примере я хочу вернуть int nums[40]
Как я могу это сделать?C++ возвращаемый тип от функции
<RETURNTYPE> test()
{
int nums[40];
for (int i=0; i < 40; i++)
{
nums[i] = i + 1;
}
return nums;
}
Вы не можете этого сделать. По нескольким причинам (включая историю и совместимость с 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);
и данные затем остаться в куче (так есть крошечная потеря производительности).
Необходимо динамически выделять память (сейчас она находится на стеке). Тип возврата будет int * then.
только Способ достижения этого заключается в том, чтобы инкапсулировать ваш массив в структуру (или объединение - что не имеет значения).
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'.
Должен ли я освобождать после этого? Я имею в виду кучу или стек? –
Это «стек». Кажется, что каждая переменная будет храниться там (вы должны проконсультироваться со стандартом ISO для получения конкретной информации). Однако вы можете иметь указатель на не-стек памяти (который часто питается вызовом функции). В нашем случае мы не возвращаем указатель, и внешняя функция не вызывается, поэтому вы можете предположить, что это стек. Поэтому внешняя работа не требуется для вызывающей функции. – AnArrayOfFunctions
Спасибо. Ясно. –
Также смотрите: http://stackoverflow.com/questions/8745260/c-return-array-from-function – NathanOliver
Почему бы не использовать 'std :: vector' вместо массива? – ForceBru
std :: vector в порядке, но я хочу 'int []' в примере. –