2015-12-12 2 views
0

Я пытаюсь создать функцию с именем getSortedRanks, которая возвращает массив. Я скопировал формат для возвращения массивов из этого вопроса Return array in a function, но массив не возвращается правильно.Функция C++ возвращает неверный массив

#include <stdlib.h> 
#include <stdio.h> 
#define familyMembers 4 

int *getSortedRanks() 
{ 
    int rankedMembers[familyMembers] = {3,4,2,1}; 
    return rankedMembers; 
} 

int main() 
{ 
    int *sortedRanks = getSortedRanks(); 

    //print the returned array 
    for(int i = 0; i < familyMembers; i ++) 
    { 
     cout << "ranked member is " << sortedRanks[i] << endl; 
    } 

    return 0; 
} 

Когда я запускаю этот вывод:

ranked member is 3 
ranked member is 0 
ranked member is 0 
ranked member is 2686744 

Первый элемент массива sortedRanks всегда правильно, но другие не являются. Как я могу исправить то, как массив возвращается?

+0

http://stackoverflow.com/q/4643713/1741542, HTTP : //stackoverflow.com/q/7499864/1741542, http://stackoverflow.com/q/13980362/1741542, http://stackoverflow.com/q/423186/1741542 должен дать вам подсказку. –

+1

Не возвращайте указатели на вещи, которые живут в стеке функции. –

+1

Почему вы используете макрос вместо статического int? –

ответ

5

Массив с автоматической продолжительности хранения:

int rankedMembers[familyMembers] = {3, 4, 2, 1}; 

живет в стеке и разрушается после getSortedRanks отделки. Возвращаемый указатель недействителен. Вывод разыгрышей приводит к undefined behavior.

Вы либо хотите:

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

    int *getSortedRanks() 
    { 
        return new int[familyMembers]{3, 4, 2, 1}; 
    } 
    

    Не забудьте delete [] это после использования. Использование smart pointer поможет вам в этом.

  2. Использование std::vector или std::array и возвращение значения:

    std::array<int, familyMembers> getSortedRanks() 
    { 
        return {3, 4, 2, 1}; 
    } 
    

(заказать менее к более благоприятным)

+1

Я получаю его сейчас. Спасибо за объяснение – Hugh

+0

Массив 'rankedMembers' не статически выделен. Причина, по которой она не существует после возвращения функции, заключается в том, что она имеет автоматическую продолжительность хранения. – Peter

+0

О, плохая терминология. – LogicStuff

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