在C ++中初始化和使用动态数组

时间:2011-11-06 12:34:09

标签: c++ arrays dynamic initialization

在我的代码中,我试图用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时,它可以工作。我做错了什么?

5 个答案:

答案 0 :(得分:6)

我看到两个问题:

  1. 该函数接受指针。当您编写A = ...时,您只需更改通过值传递给您的指针副本。您可以使用void initArray(int* &A, int size)代替,或让函数返回指针。

  2. 如果这是完整代码,您可能需要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”