2010-09-20 2 views
-1

Почему следующий код не работает?Как вернуть массив в C++?

Это компилируется нормально, но выход что-то вроде адреса, если я пишу f с помощью * и выход 0, если я пишу f без *.

#include <iostream> 
#include<cstring> 
using namespace std; 
using std::size_t; 
int *f(size_t s){ 
    int *ret=new int[s]; 
    for (size_t a=0;a<s;a++) 
      ret[a]=a; 
     return ret; 
     } 
int main(){ 

    size_t s=20; 
    cout<<*f(s)<<endl; 

    return 0; 
} 
+0

Пожалуйста, пост код. –

+0

Что делать? – sje397

+10

Вы уже задали здесь несколько десятков вопросов и до сих пор не знаете, как форматировать код? Что мешает вам возглавить подсказки рядом с полем редактирования? – sbi

ответ

0

Лучший способ получить массив из функции, давая ссылку на него в качестве входного аргумента (т.е. передать указатель на начало массива), то, как только ваша функция будет завершена, массив, в который вы прошли, будет заполнен функцией. Я бы не советовал даже пытаться вернуть его.

Альтернатива - это что-то вроде класса STL Vector (http://www.cplusplus.com/reference/stl/vector/) или аналогичных вариантов, которые могут быть возвращены, но это действительно зависит от того, для чего вы собираетесь использовать его.

+0

Это динамически распределенный массив. Код должен работать нормально, как есть. – sbi

+0

Я всегда учил, что было плохой практикой возвращать массив, созданный в функции. Это просто кажется немного грязным. – n00dle

+0

Ahh, я понимаю, что вы имеете в виду сейчас. Хорошо, да, новичка. – n00dle

2

F (s) возвращает Int * так * е (s) является Int (1-ый элемент из выделенного массива) со значением 0. Это то, что должно появиться, только 0

0

You не может использовать оператор << для вывода массива. Вы должны создать цикл for и распечатать каждую запись.

Сохраните вывод f переменной и распечатайте каждую запись.

12

Вы используете C++, просто использовать зЬй :: вектор вместо этого, это все упрощает:

#include <iostream> 
#include <vector> 

std::vector<int> f(size_t s){ 
    std::vector<int> ret(s); 
    for (std::size_t a=0;a<s;a++) 
      ret[a]=a; 
     return ret; 
     } 
int main(){ 

    std::size_t s = 20; 
    std::vector<int> v = f(s); 
    for(std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) // go through each element 
     std::cout<< *it << std::endl; 

    for(int idx = 0; idx != v.size(); ++idx) // simpler variant that is equivalent in this example 
     std::cout<< v[idx] << std::endl; 


    return 0; 
} 
+1

Это пропускает несколько префиксов 'std ::'. Тем не менее, '+ 1' от меня. Это единственный разумный вариант для новичков. – sbi

+0

Ах да, забыл исправить это после того, как скопировать код из вопроса ... нужно исправить сейчас. – Klaim

+0

+1 от меня также, однако, много раз это требование домашнего задания не касаться стандартных контейнеров - говоря по опыту. – Samaursa

11

Функция f(s) возвращает адрес динамически выделенный массив.

Если вы cout<<f(s)<<endl; он будет печатать этот адрес, и если вы cout<<*f(s)<<endl; печатает значение в индексе 0, который 0.

Если вы хотите напечатать весь массив, запустить цикл, как:

int *p = f(s); 
for (size_t a=0;a<s;a++) { 
    cout<<*(p+a)<<endl; 
} 
2

Это легче понять, если код разделен на 2 строки:

int* ret = f(s); 
cout<<*ret<<endl; 

* RET = = ret [0] == 0. Из-за этого он печатает 0 для отправленного вами кода.

* Примечание что вы выделяете массив (используя новый), но не освобождая его.

Если ваше намерение напечатать все элементы в массиве, вы можете использовать следующий код:

size_t s=20; 
int* ret = f(s); 
for (size_t i = 0; i < s; i++) 
    cout<< ret[i] << " "; 
delete[] ret; 
+2

'delete ret' вызывает неопределенное поведение, оно должно быть' delete [] ret'. – fredoverflow

+0

Спасибо. Исправлен ответ. – rkellerm

2

Как @frag говорит главный() ничего не знает о типе f(s) за исключением того, что указатель на int. У него нет никаких оснований искать 19 других ints.

Ваша главная функция должна выглядеть следующим образом:

int main(){ 

    size_t s=20; 
    int *p = f(s); 
    for (size_t i=0; i<s; i++) 
     cout<<*(p+i)<<endl; 

    return 0; 
} 
Смежные вопросы