2013-03-22 1 views
0

У меня есть структура, которая включает в себя поле string. Я создаю массив этих структур, а затем я хочу передать их функции (по ссылке). Все работает отлично, когда я комментирую поле string, но если я не запускаю программу, она перестает работать. Я не могу найти ответ на этот везде ..Невозможно работать с массивом структур, которые содержат строку C++

Вот код (я уменьшил его, чтобы показывать только вопрос):

struct student { 
    int a; 
    int b; 
    string name[20]; 
    char status; 
}; 

void operation(student the_arr[1],int number_of_students) { 
    delete[] the_arr; 
    the_arr = new student[3]; 
    for(int i = 0; i<3; i++) { 
     the_arr[i].a = i+5; 
     the_arr[i].b = i+4; 
    } 
} 

int main() {  
    student *abc; 
    abc = new student[0]; 
    operation(abc, 0); 
    system("pause"); 
    return 0; 
} 

мне нужен массив быть динамичным, так что я могу изменить его размер, когда мне нужно.

+6

Вам следует использовать вектор. – chris

+0

Да, используйте контейнер C++, такой как вектор. –

+1

'new student [0]', 'void operation (student the_arr [1], ...': WAT? – us2012

ответ

1

Предполагая, что вы не можете использовать std::vector вместо динамически распределенных массивов, следуйте приведенному ниже ответу. В любом другом случае вы должны использовать контейнеры, предоставляемые стандартной библиотекой.

Примечание: Ваша программа не сбой. Единственное, что компилятор будет жаловаться на него, - allocating zero elements, но позволит вам скомпилировать и запустить эту программу.

Ваша функция совершенно неправильная. При использовании динамического выделения вы можете просто передать указатель, как это:

void operation(student* the_arr, int number_of_students) { 

Тогда внутри вашей функции вы динамическое распределения памяти, которая хранится внутри the_arr указателя, который не передаются по ссылке, следовательно, ведущей к созданию местного переменная указатель, который потеряет указатель после его исполнения:

void operation(student*& the_arr [...] 

Я предлагаю вам, чтобы избежать решения ниже, хотя и возвращает новый указатель вместо:

student* operation(student* the_arr, int number_of_students) { 
    delete[] the_arr; 
    the_arr = new student[3]; 
    [...] 
    return the_arr; // <---- 
} 

Выделение abc = new student[0]; не имеет никакого смысла. Вы пытаетесь выделить массив из 0 элементов. Может, ты имел в виду abc = new student[1];?

+0

В то время как проблемы, они не должны влиять на опубликованный код как есть. Я чувствую, что опубликованный код, как и не сбой, хотя, несмотря на утечку памяти. – chris

+1

@Jueecy: Вы уверены, что это недействительно? –

+0

@OliCharlesworth, нет, не уверен. – Shoe

0

Вы должны просто использовать векторные или другие объекты последовательности. Хотя я не уверен, что вы пытаетесь сделать с вашим кодом. Вот краткий пример:

// Vector represent a sequence which can change in size 
vector<Student*> students; 

// Create your student, I just filled in a bunch of crap for the 
// sake of creating an example 
Student * newStudent = new Student; 
newStudent->a = 1; 
newStudent->b = 2; 
newStudent->name = "Guy McWhoever"; 
newStudent->status = 'A'; 

// and I pushed the student onto the vector 
students.push_back(newStudent); 
students.push_back(newStudent); 
students.push_back(newStudent); 
students.push_back(newStudent); 
+0

Он сказал, что не может использовать векторы. Наверное, потому что это домашнее задание. – Shoe

+1

В любом случае, используйте вектор 'Student', а не вектор' Student * '. – chris

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