Возникли проблемы при использовании массива, который возвращается функцией в C ++ - PullRequest
0 голосов
/ 17 октября 2011

У меня есть функция, которая генерирует значения в массиве и возвращает указатель на этот массив. Вот код MWE:

int *f(size_t s)
{
    int *ret=new int[s];
    for(size_t a=0;a<s;a++)
    {
    ret[a]=a;
    cout << ret[a] << endl;
    }
    return ret;
}

обратите внимание, что у меня есть строка cout для цикла for, чтобы доказать себе, что массив заполняется правильно.

Теперь вот моя проблема. Я не могу найти правильный метод использования возвращенного массива. Вот что я делал:

int main (void)
{
 int ary_siz = 10;
 int ary[ary_siz];
 *ary = *f(ary_siz);
 cout << ary[0] << endl;
 cout << ary[2] << endl;
 cout << ary[3] << endl;
}

Первый элемент в ary кажется правильным. Другие (ary[1], ary[2] ...) - нет. Может кто-нибудь сказать мне, что я делаю не так?

Ответы [ 4 ]

4 голосов
/ 17 октября 2011
int main (void)
{
 int ary_siz = 10;
 int *ary = f(ary_siz);
 cout << ary[0] << endl;
 cout << ary[2] << endl;
 cout << ary[3] << endl;
 delete [] ary;
}
1 голос
/ 17 октября 2011

Вы выделяете массив в функции и просто назначаете его первый элемент первому элементу вашего массива, выделенного в стеке, вместо того, чтобы просто использовать возвращаемый массив.

Вы должны сделать что-то подобное:

int main (void)
{
 int ary_siz = 10;
 int *ary;
 ary = f(ary_siz);
 cout << ary[0] << endl;
 cout << ary[2] << endl;
 cout << ary[3] << endl;
 delete[] ary // don't forget to release the memory
 return 0; // You should return something in the main function
}

Более того, в C ++ вы должны по возможности использовать векторы вместо «голых металлических» массивов.

1 голос
/ 17 октября 2011

Назначение

*ary = *f(ary_siz);

копирует один элемент. Используйте

int main (void)
{
 int ary_siz = 10;
 int *ary = f(ary_siz);

 delete[] ary;
}

также исправление утечки памяти

0 голосов
/ 17 октября 2011

Как насчет этого?

int *ary = f(ary_siz);

Вы можете просто использовать оператор [], как в кутах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...