Я пытаюсь вернуть массив и передать его другой функции:
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
Как-то мой массив становится испорченным, когда я пытаюсь передать его простой функции печати. Что я делаю не так?
Вы возвращаете указатель на массив, который является локальной переменной функции 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;
}
Вы возвращаете указатель на временный локальный объект, который уничтожается сразу после выхода из функции.
Почему бы вам не попробовать 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);
}
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;
}
auto
- одна из самых простых вещей при изучении C ++. Кстати, я прокомментировал не-автоматический способ.