在我的代码中,我试图用initArray函数创建一个动态数组,而在main中我想使用这个初始化数组。但是,每当我在main中调用初始化数组时,它都会给我一个错误。
这是我试过的:
void main()
{
int *a = NULL;
int n;
cout<<"Enter size:";
cin>>n;
initArray(a,n);
for(int j=0;j<n;j++)
{
cout<<a[j]<<endl;//Crashes here
}
}
void initArray(int *A, int size)
{
srand((unsigned)time(0));
A = new int[size];
for(int i=0;i<size;i++)
{
A[i] = rand()%10;
}
}
当我在main中执行initArray时,它可以工作。我做错了什么?
答案 0 :(得分:6)
我看到两个问题:
该函数接受指针。当您编写A = ...
时,您只需更改通过值传递给您的指针副本。您可以使用void initArray(int* &A, int size)
代替,或让函数返回指针。
如果这是完整代码,您可能需要initArray
函数的前向声明。
答案 1 :(得分:5)
我做错了什么?
不使用std::vector
就是你做错了。
除此之外,假设这是为了学习或做作业或其他事情:
initArray(a,n);
此行复制 int
指针a
。函数内部的副本被分配,main中的副本将保持为空。您需要使用pass-by-reference,通过C ++引用或带有指针的C风格:
void initArray(int*& a, int size){
// everything the same
}
这将修改main中的int指针,而不进行任何其他更改。
void initArray(int** a, int size){
// need to dereference the pointer-to-pointer to access the int pointer from main
*a = new int[size];
for(/*...*/){
(*a)[i] = /*...*/;
}
}
对于这个,您还需要更改呼叫方:
initArray(&a, n); // pass pointer to a
现在最后一件事:main
甚至不知道initArray
甚至存在。您需要将其置于main
之上或至少向前声明它:
void initArray(int*& a, int size); // forward declaration
int main(){
// ...
}
void initArray(int*& a, int size){
// ...
}
最后一件事,你需要在{main}中delete[]
数组。
答案 2 :(得分:3)
您需要将initArray
函数定义置于main
之上或至少将其声明为main
之上。
另请注意,作业A = new int[size];
仅修改函数A
内的局部变量initArray
。它对a
内的main
没有影响,因为指针是按值传递的。您需要传递引用或指向指针的指针,或者更好的是,返回指针:
int* initArray(int size) // note: one less parameter
{
srand((unsigned)time(0));
int* A = new int[size];
for(int i=0;i<size;i++)
{
A[i] = rand()%10;
}
return a; // note: return the pointer
}
然后在a = initArray(n);
内写main
。另外,不要忘记delete[] a;
内的main
!
当然通常的建议是,不要使用原始指针来动态数组,而是使用std::vector
。但是,因为我认为这是一个糟糕的C ++课程的作业,你可能别无选择。
答案 3 :(得分:1)
您正在将指针的副本传递给initArray
,并将其作为参考initArray(int *&A, int size)
#include <iostream>
using namespace std;
void initArray(int *&A, int size); // put the declaration of function here
int main()
{
int *a = 0;
int n;
cout << "Enter size:";
cin >> n;
initArray(a,n);
for(int j=0;j<n;j++)
{
cout<<a[j]<<endl;
}
delete[] a; // delete your array before exiting the program
}
// pass it as a reference to pointer
void initArray(int *&A, int size)
{
srand((unsigned)time(0));
A = new int[size];
for(int i=0;i<size;i++)
{
A[i] = rand()%10;
}
}
答案 4 :(得分:0)
你可以改变initArray的直接性:
void initArray(int* &A, int size)
在初始代码中,数组未填充。因为,数组是主数组的副本。所以a数组保持等于null。 然后你可以选择传递一个引用“int *&amp; A”,如我所做的那样或者通过地址:“int ** A”