2013-11-03 5 views
1

Я пытаюсь передать массив в функцию, а затем распечатать значения, найденные внутри массива.возвращающий массив с использованием функций - C++

это то, что у меня есть

numbers.cpp

#include <iostream> 
#include <string> 
#include "numbers.h" 

int * numbers::printNumbers() { 

    for (int i=0; i<3; i++) { 
     for (int j=0; j<3; j++) { 
      arrayOne[j] =i; 
     } 
    } 
    return arrayOne; 
} 

numbers.h

#ifndef try_numbers_h 
#define try_numbers_h 
#include <iostream> 
#include <string> 

class numbers { 

public: 

     int * printNumbers(); 

private: 

     int arrayOne[4]; 
}; 

#endif 

main.cpp

#include <iostream> 
#include <string> 
#include "numbers.h" 

int main() { 
    numbers printNum; 
    int * p; 
    p = printNum.printNumbers(); 

} 

кодов, приведенных выше, выполняется успешно

но мой выход возвращаются некоторым странный адрес памяти

выхода

0x7fff5fbff8e0 

по праву должны вывести

удвоить объемы

0 
1 
2 
3 
+0

Стандартный ответ 1A: используйте 'std :: vector' вместо массива. –

ответ

1

Вашего код правильно.

Адрес памяти, на котором он печатается, является адресом начала переменной класса arrayOne. Причина вы видите, что вместо того, чтобы:

0 
1 
2 
3 

что этот бит кода:

numbers printNum; 
int * p; 
p = printNum.printNumbers(); 

только будучи назначен адрес массива arrayOne, а не значение из его содержание.

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

Для этого вы должны перебрать указатель на массивarrayOne и вывести их, чтобы вы могли видеть/проверять ожидаемые результаты.

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

И, учитывая, что массивы имеют встроенное в них измерение размера что было бы лучше, поскольку другие предложили вместо этого использовать std::vector, так как это безопаснее, очищается после себя и имеет гораздо больше функциональности и преимуществ по сравнению с массивами C-Style с аналогичной производительностью.

+0

спасибо за ваш совет – user2935569

+1

@ user2935569: добро пожаловать! И тебе спасибо. :) – jrd1

0

Вы можете сделать свой arrayOne общественностью и printNumbers() void. Тогда в основном.cpp выполните следующие действия: 1) выполните функцию printNum.printNumbers() 2) назначьте p вашим printNum.arrayOne. Надеюсь, это поможет!

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