我正在尝试在我的项目中创建一个新数组
代码是:
#include <iostream>
using namespace std;
void makeArray( int *& arrayPtr, int size );
int main( )
{
int * arrPtr;
int size =10;
makeArray( arrPtr, size );
for(int j=0;j<size;j++)
{
cout<<arrPtr[j]<<endl;
}
}
void makeArray( int *& arrayPtr, int size )
{
int arr[size-1];
for(int i=0;i<size;i++)
{
arr[i]=0;
}
*&arrayPtr=*&arr;
}
根据要求我需要使用上面的“makeArray”方法来制作数组。 当我运行代码时,输出是垃圾值不是零.....
任何帮助将不胜感激
谢谢
答案 0 :(得分:4)
创建数组的方式是在堆栈上,这意味着在makeArray函数完成后它将不存在。
您需要在堆上分配数组。
所以:
int arr[size-1];
应该是:
int *arr = new int[size-1];
另外,我认为你的意思是在makeArray()中执行此操作:
arrayPtr = arr;
而不是:
*&arrayPtr=*&arr;
在这种情况下编译但是更复杂并且在功能上是相同的。
但是你可能更喜欢只返回一个int *而不是引用指针。
然后当你在main()中使用数组时,将它设置为NULL,以防你不小心再次使用它,如下所示:
for(int j=0;j<size;j++)
{
cout<<arrPtr[j]<<endl;
}
delete [] arrPtr;
arrPtr = NULL;
答案 1 :(得分:0)
为什么要将参数声明为'int *&amp; arrayPtr“?你只需要一个指向数组的指针吗?你应该使用'int * arrayPtr'代替。
要回答你的问题,问题是你在函数makeArray的堆栈中声明了一个数组。完成一个函数后,该函数的堆栈将被销毁,因此您将传递垃圾数据的地址。为避免这种情况,请改为使用动态内存分配。
编辑:此外,您应该使用memset而不是for循环将数组归零。它快得多。
答案 2 :(得分:0)
您在“makeArray()”中分配的“arr”是本地的。当函数结束时,数组就会被释放。当你回到主要时,你会得到垃圾。 你想要做的是使用“new”运算符来分配这个新数组,以便在所有程序中使用,除非你通过“delete”释放这个内存。 所以你可以将你的makeArray()设置为:
int* makeArray(int size )
{
int *arr = new[size];
for(int i=0;i<size;i++)
{
arr[i]=0;
}
return arr;
}
您需要通过以下方式初始化您的arry:
int * arrPtr = makeArray(10);
只是不要忘记在finsh之后释放这个记忆:
删除[] arrPtr;