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);