C++ 在cpp中生成数组

C++ 在cpp中生成数组,c++,arrays,C++,Arrays,我正在尝试在我的项目中创建一个新数组 代码是: #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

我正在尝试在我的项目中创建一个新数组

代码是:

#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;
}
#包括
使用名称空间std;
void makeArray(int*&arrayPtr,int size);
int main()
{
int*arrPtr;
int size=10;
makeArray(arrPtr,size);

对于(int j=0;j来说,创建数组的方式是在堆栈上的,这意味着在makeArray函数完成后它将不存在

您需要在堆上分配数组

因此:

应该是:

int *arr = new int[size-1];
另外,我认为您的意思是在makeArray()中执行此操作:

而不是:

*&arrayPtr=*&arr;
它可以编译,但更复杂,在这种情况下功能相同

但是您可能更喜欢只返回int*而不是引用指针

然后在main()中使用完数组后,将其设置为NULL,以防再次意外使用,如下所示:

for(int j=0;j<size;j++)
{
  cout<<arrPtr[j]<<endl;
}
delete [] arrPtr;
arrPtr = NULL;

for(int j=0;j创建数组的方式在堆栈上,这意味着在makeArray函数完成后它将不存在

您需要在堆上分配数组

因此:

应该是:

int *arr = new int[size-1];
另外,我认为您的意思是在makeArray()中执行此操作:

而不是:

*&arrayPtr=*&arr;
它可以编译,但更复杂,在这种情况下功能相同

但是您可能更喜欢只返回int*而不是引用指针

然后在main()中使用完数组后,将其设置为NULL,以防再次意外使用,如下所示:

for(int j=0;j<size;j++)
{
  cout<<arrPtr[j]<<endl;
}
delete [] arrPtr;
arrPtr = NULL;

for(int j=0;j为什么要将参数声明为“int*&arrayPtr”?是否只需要指向数组的指针?应该改用“int*arrayPtr”

要回答您的问题,问题在于您正在函数makeArray的堆栈中声明一个数组。函数完成后,该函数的堆栈将被销毁,因此您正在传递垃圾数据的地址。为避免此情况,请改用动态内存分配


编辑:另外,你应该使用memset而不是for循环来归零数组。这要快得多。

为什么你要将一个参数声明为“int*&arrayPtr”?你只需要一个指向数组的指针吗?你应该改为使用“int*arrayPtr”

要回答您的问题,问题在于您正在函数makeArray的堆栈中声明一个数组。函数完成后,该函数的堆栈将被销毁,因此您正在传递垃圾数据的地址。为避免此情况,请改用动态内存分配

编辑:另外,你应该使用memset而不是for循环来归零数组。这要快得多。

你在“makeArray()”中分配的“arr”是本地的。当函数结束时,数组被释放。当你回到main时,你会得到垃圾。 您要做的是,使用“new”操作符分配这个新数组以在所有程序中使用,除非您将通过“delete”释放这个内存。 因此,您可以将makeArray()设置为:

在您完成以下操作后,请不要忘记释放此内存:

delete[]arrPtr;

在“makeArray()”中分配的“arr”是本地的。当函数结束时,数组被释放。当您返回main时,您会得到垃圾。 您要做的是,使用“new”操作符分配这个新数组以在所有程序中使用,除非您将通过“delete”释放这个内存。 因此,您可以将makeArray()设置为:

在您完成以下操作后,请不要忘记释放此内存:


删除[]arrPtr;

这甚至可以编译?你在使用GCC吗?我认为最后一行有点尴尬:有*&和删除它是一样的,也就是说,这一行将等于*&arrayPtr=arr;那么,当有一个非常好的
std::vector
类时,你为什么要这样做?这是课业吗?这甚至可以编译吗?你在使用GCC吗?我认为最后一行是一行有点尴尬:有*&和删除它是一样的,也就是说,行将等于*&arrayPtr=arr;那么,当有一个非常好的
std::vector
类时,你为什么要这样做呢?这是课业吗?因为他在重新放置指针,他确实需要通过引用来传递它。哦,好的。我的C++-fu有点生锈了。因为他正在重新放置指针,他确实需要通过引用传递它。哦,好的。我的C++-fu有点生锈了。你可能想突出显示你应该在哪里
删除[]
这个以避免内存泄漏。你可能想突出显示你应该在哪里
删除[]
这个以避免内存泄漏。
int * arrPtr = makeArray(10);