我正在尝试返回一个数组并将其传递给另一个函数:
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
当我尝试将它传递给一个简单的打印功能时,不知何故,我的数组变得混乱了。我做错了什么?
答案 0 :(得分: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
一个:
void printArray(const std::vector<int>& amountArray)){
std::cout << amountArray[0] << std::endl;
}
答案 1 :(得分: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);
}
答案 2 :(得分: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;
}