Указатель на вектор в структуре C

#c #vector #struct

#c #вектор #структура

Вопрос:

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

 struct Students 
{
char* names;
std::vector<int> scores;
};
  

Есть ли способ сделать так, чтобы мой вектор не вызывал ошибку в моей структуре. Вот мой вызывающий код.

 while(scores.hasNext())
{
    students[current_student].scores.push_back(grade);
}
  

Мой вопрос: если это проблема с распределением размера вектора внутри структуры, могу ли я объявить указатель на вектор и ссылаться на свой вектор вместо того, чтобы иметь его на самом деле в структуре?

Оценки — это просто целое число.

Комментарии:

1. У вас нет «указателя на вектор в структуре». Опубликованный код не имеет смысла.

2. Проблема где-то в другом месте вашего кода.

3. требуется дополнительная информация. Какой тип students и grade ? Также выдает сообщение об ошибке.

4. Извините. Я только что понял, что сформулировал не весь свой вопрос. Я обновил его.

5. Я подозреваю, что в вашем вопросе отсутствует довольно много логики, которая может быть актуальной. Что такое оценки типа? — откуда это? Какого рода ошибку вы на самом деле получаете? всегда ли он находится в одном и том же месте? Все эти факты могут помочь вам устранить проблему, поскольку я не могу быть уверен, в чем заключается ваша ошибка….

Ответ №1:

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

Очевидно, что students это массив структуры Students . Предполагая, что он размещен в куче, если вы сделаете это с помощью malloc , это не будет работать должным образом, потому что malloc не будет должным образом инициализировать элементы в структуре. В частности, здесь scores находится объект, отличный от POD, и его необходимо правильно сконструировать, вызвав его конструктор.

 // the member in your structure is not initialized
students = (struct Students*) malloc(10 * sizeof(Students));

// oops.. scores is not initialized
students[0].scores.push_back(100);
  

Чтобы решить эту проблему, вместо этого вам нужен call new . Он будет правильно инициализировать элементы, вызывая их конструкторы.

 // ok
students = new Students[10];
  

Ответ №2:

Если вы получаете какую-либо ошибку из vector кода в этой строке

 students[current_student].scores.push_back(grade);
  

это не означает, что проблема в векторе. на самом деле это означает, что вы обращаетесь к недопустимой памяти (не инициализированной или не выделенной). Возможно, current_student он выходит за пределы students , или вы выделили его students с помощью вызова malloc вместо new .

На ваш вопрос нельзя ответить, не предоставив больше вашего кода.

Ответ №3:

Прежде всего, вы не должны думать о struct как о странных вещах, которые требуют особых мер предосторожности. Они эквивалентны классу

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

 while(scores.hasNext())
{
  students[current_student].scores.push_back(grade);
}
  

затем вы будете продолжать добавлять элементы в свой вектор (если hasNext() работает так, как кажется), пока не получите std::bad_alloc()

И, наконец, не беспокойтесь о размере вашего вектора: a std::vector по сути, уже является указателем на вектор в куче. Ваша структура останется «маленькой», независимо от того, насколько «толстым» станет ваш вектор.