2013-10-15 6 views
1

Я хочу создать динамический массив указателей, каждый из которых указывает на структуру. В программе есть возможность добавлять структуры, и если счетчик достигает последнего значения массива, массив расширяется.Как создать указатель на массив указателей на struct?

struct student 
{ 
    string id; 
    string name; 
}; 

int N=5; 
int counter=0; 
student **big=new student *[N]; //a ptr to an array of ptr's. 

void add_student (int &counter,student **big) 
{ 
    int i; 

    if (counter==0) 
    { 
     for (i=0; i<N; i++) 
     { 
      big[i]=new student; 
     } 
    } 

    if (counter==N) 
    { 
     N+=5; 
     student **temp=new student *[N]; 
     for (i=counter-1; i<N; i++) 
     { 
      temp[i]=new student; 
     } 

     for (i=0; i<counter; i++) 
     { 
      temp[i]=big[i]; 
     } 

     delete [] big; 
     big=temp; 
    } 

    cout<<"Enter student ID: "<<endl; 
    cin>>(*big)[counter].id; 

    cout<<"Enter student name: "<<endl; 
    cin>>(*big)[counter].name; 

    counter++; 
} 

Когда я запускаю программу, он падает после того, как я попытаюсь добавить более одного ученика. Благодаря!

+6

Почему вы не просто шаг в вашей C++ сапоги, и использовать STL? Вот почему у этого есть * контейнеры *, чтобы избавить вас от необходимости повторного внедрения этого конкретного колеса. – unwind

+0

Как указано выше, используйте 'std :: vector' указателей' student', например: 'std :: vector ', а затем просто используйте pushback для добавления новых указателей. –

+1

Я продолжаю видеть вопросы на C++ о желании использовать «динамические массивы» ... Я предполагаю, что некоторые курсы необходимо обновить в некоторых школах. – crashmstr

ответ

0

Попробуйте этот код. Основная проблема заключалась в том, что вы пишете (*big)[counter].id, не считая это действительной памятью. В моей функции ниже объекта-ученика создается сначала, а затем записывается.

PS: Я не тестировал код, сообщите мне, есть ли у него проблемы с ним.

struct student { 
    string id; 
    string name; 
}; 

int N=5; 
int counter=0; 
student **big = new student *[N]; //a ptr to an array of ptr's. 

// Variable big and counter is global, no need to pass as argument. 
void add_student (student *new_student) { 
    // Resize if needed 
    if (counter==N) { 
     int i; 

     student **temp=new student *[N+5]; 

     // Copy from the old array to the new 
     for (i=0; i<N; i++) { 
      temp[i]=big[i]; 
     } 

     // Increase maximum size 
     N+=5; 

     // Delete the old 
     delete [] big; 
     big=temp; 
    } 

    // Add the new student 
    big[counter] = new_student; 

    counter++; 
} 

// Function called when we should read a student 
void read_student() { 
    student *new_student = new student; 

    cout<<"Enter student ID: "<<endl; 
    cin>>new_student->id; 

    cout<<"Enter student name: "<<endl; 
    cin>>new_student->name; 

    // Call the add function 
    add_student (new_student); 
} 
+0

Когда вы говорите, что сначала создается объект-ученик. Где именно в коде? –

+0

Его здесь: 'student * new_student = new student;'. Я выделяю память для нового ученика, а затем использую cin << для записи на этот новый объект. – Atle

+0

Это работает! поэтому просто для того, чтобы быть понятным. Если я создаю указатель на массив указателей на structs, я должен создать объекты для записи на них. –

0

Я просто попробовал. ошибка заключается в том, что вы неправильно обрабатываете указатель на указатель на структуру. для передачи указателя на указатель на что-то означает, что функция может изменить адрес указателя не только на предмет, на который он указывает. поэтому объявление указателя на указатель в функции в порядке, но объявление глобальной переменной p на p не имеет особого смысла. Вы можете добиться такого же эффекта, используя & ptr. для p до p, чтобы передать адрес указателя на функцию. Я внес некоторые изменения, но я не уверен, работает ли это. Я попробую снова через 4/5 часа и подробно рассмотрю проблему. в настоящее время, пожалуйста, довольствуйтесь следующим. (Могут быть некоторые ошибки ниже, поэтому будьте осторожны)

struct student 
    { 
     string id; 
     string name; 
    }; 

    int N=5; 
    int counter=0; 
    student *big=new student[N]; //a ptr to an array of ptr's. 

    void add_student (int &counter,student **ppBig) 
    { 
    int i; 

    if (counter==0) 
    { 
    for (i=0; i<N; i++) 
     *ppBig[i]=new student; 
    } 

if (counter==N) 
{ 
    N+=5; 
    student *temp=new student [N]; 
    for (i=counter-1; i<N; i++) 
     temp[i]=new student; 

    for (i=0; i<counter; i++) 
     temp[i]=*ppBig[i]; 

    delete[] *ppBig; 
    ppBig=temp; 
} 


cout<<"Enter student ID: "<<endl; 
cin>>(*big)[counter].id; 

cout<<"Enter student name: "<<endl; 
cin>>(*big)[counter].name; 

counter++; 

}

Смежные вопросы