Возврат и передача массива для работы в C ++

0

Я пытаюсь вернуть массив и передать его другой функции:

    int* getBasicArray(){
        int amountArray[5];
        amountArray[0]=1;

        return amountArray;
    }
    void printArray(int (*amountArray)){
        cout <<amountArray[0]<<endl;
    }
int main() 
{
    int* test=getBasicArray();
    cout <<test[0]<<endl; //Prints 1
    printArray(test); //Prints 19354128

Как-то мой массив становится испорченным, когда я пытаюсь передать его простой функции печати. Что я делаю не так?

Теги:
arrays

3 ответа

2

Вы возвращаете указатель на массив, который является локальной переменной функции getBasicArray. Это висячий указатель, и удаление ссылок - это неопределенное поведение. Вместо этого вы можете попробовать вернуть std::array или std::vector. Это пример использования std::array:

std::array<int,5> getBasicArray()
{
    std::array<int, 5> amountArray;
    amountArray[0]=1;
    return amountArray;
}

Затем соответствующим образом измените свою функцию. Это версия std::array:

template <size_t N>
void printArray(const std::array<int,N>& amountArray)){
    std::cout << amountArray[0] << std::endl;
}

и это std::vector one:

void printArray(const std::vector<int>& amountArray)){
    std::cout << amountArray[0] << std::endl;
}
2

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

Почему бы вам не попробовать std::vector и избавиться от указателей?

std::vector<int> getBasicArray()
{
   std::vector<int> amountArray(5);
   amountArray[0]=1;

   return amountArray;
}

void printArray(const std::vector<int> &arr)
{
   for (auto &x : arr)
        cout << x <<endl;
}

int main() 
{
    auto test = getBasicArray(); // std::vector<int> test =  getBasicArray();

    cout <<test[0]<<endl;

    printArray(test); 
}
  • 0
    Ключевое слово auto (и весь стиль foreach) может немного сбить с толку, если автор темы не знаком с c ++ 11 (и что-то заставляет меня так думать)
  • 1
    @ mexus: я не согласен с вами, auto - одна из самых простых вещей при изучении C ++. Кстати, я прокомментировал не-автоматический способ.
Показать ещё 1 комментарий
0

getBasicArray не очень хорошо себя ведет, указатель укажет мусор, как только он вернется. Если вы действительно хотите выделить массив, вам нужно будет сделать это с помощью operator new[].

int* getBasicArray() {
    return new int[5];
}

Обратите внимание, что вы больше не используете автоматическое хранилище, и вы должны позвонить delete, когда хотите освободить используемую память.

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

Альтернативами являются std::vector и std::array. Используйте последний, когда вы знаете размер массива во время компиляции, первый, когда вы знаете размер во время выполнения.

В этом случае вы знаете размер во время компиляции, поэтому используйте std :: array.

std::array<int, 5> get_basic_array()
{
    std::array<int, 5> arr;
    arr[0] = 1;

    return arr;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню