Инициализация и использование динамических массивов в C ++ - PullRequest
2 голосов
/ 06 ноября 2011

В моем коде я пытаюсь создать динамический массив с функцией initArray, и в основном я хотел бы использовать этот инициализированный массив. Однако всякий раз, когда я вызываю инициализированный массив в 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;
    }
}

Когда я делаю часть initArray в main, она работает. Что я делаю не так?

Ответы [ 5 ]

6 голосов
/ 06 ноября 2011

Я вижу две проблемы:

  1. функция принимает указатель. Когда вы пишете A = ..., вы изменяете только копию указателя, который передается вам по значению. Вместо этого вы можете использовать void initArray(int* &A, int size) или сделать так, чтобы функция возвращала указатель.

  2. если это полный код, вам может потребоваться предварительное объявление функции initArray.

5 голосов
/ 06 ноября 2011

Что я делаю не так?

Не использовать std::vector - это то, что вы делаете неправильно.

Если не считать, что это для обучения или домашней работыили что-то:

initArray(a,n);

Эта строка копирует указатель int a.Копия внутри функции будет назначена, а копия в основном останется пустой.Вам необходимо использовать передачу по ссылке, либо через ссылки C ++, либо в стиле C с указателями:

void initArray(int*& a, int size){
  // everything the same
}

Это изменит указатель int в main без каких-либо других изменений.

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){
  // ...
}

И последнее: вам нужно delete[] массив в main.

3 голосов
/ 06 ноября 2011

Вам нужно поместить определение функции 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 ++, у вас, вероятно, нет выбора.

1 голос
/ 06 ноября 2011

Вы передаете копию вашего указателя на 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;
    }
}
0 голосов
/ 06 ноября 2011

Вы не можете изменить объявление initArray:

void initArray(int* &A, int size)

в исходном коде, массив не заполнен. Потому что, массив является копией основного массива.таким образом, массив остается равным нулю.у вас есть выбор между передачей по ссылке "int * & A", как я сделал, или по адресу: "int ** A"

...