#c #debugging #assertion
#c #отладка #утверждение
Вопрос:
Я пытаюсь, чтобы указатель в структуре указывал на массив структур другого типа. Вот мой код:
struct Mesh
{
long masterRef; // The global fragment number
long polygonCount; // Number of polygons in the mesh
long vertexCount; // Number of verticies in the mesh
Vertex *verti; // Pointer to verticies in the mesh
Poly *poly; // Pointer to polygons in the mesh
float center[3]; // The center of the mesh
bool isVisible; // Is the mesh currently visible?
} typedef Mesh;
struct Region
{
bool hasPoly;
long size1;
long size2;
long size3;
long size4;
long size5;
long size6;
Mesh* meshptr; // the mesh with the polygons for this region
long meshRef;
std::vector<int> visvector;
long regionsVisible;
};
Как вы можете видеть, я пытаюсь создать указатель сетки в Region struct. Указатель будет указывать на ячейку в массиве ячеек. Одна эта строка приводит к аварийному завершению работы программы с сообщением о сбое утверждения отладки и «Выражение: недопустимый нулевой указатель»
Кто-нибудь знает, в чем может быть проблема? Я бы опубликовал вызывающий код, но без него происходит сбой.
Комментарии:
1. @James Я полностью удалил вызывающий код, и он по-прежнему вылетает. Простое закомментирование строки Mesh * meshprt; заставляет ее снова нормально работать.
2. @Satchmo Brown — Учитывая сообщение —
"Expression: invalid null pointer"
, проверьте,meshptr
указывает ли отладчик на какое-либо допустимое местоположение с помощью указателя сбоя. Также вы нарушаете — Правило трех C .3. Он не может завершиться сбоем без кода 🙂 Не могли бы вы, пожалуйста, опубликовать строку, которая завершается сбоем (возможно, с необходимым контекстом)?
4. @Vlad У него нет вызывающей строки. Я серьезно. Может быть, когда создается массив Region, но происходит сбой, когда эта строка есть, а не когда ее нет. Нигде нет другого кода, который включал бы meshptr. Я обещаю.
5. Если ваш код завершает работу без назначения указателя, то в вашей программе есть другая проблема. В лучшем случае я думаю, что вы, возможно, присваиваете адрес переменной стека и пытаетесь использовать его позже, но нам действительно нужен некоторый код.
Ответ №1:
Я думаю, ваша проблема в том, что вы «пытаетесь, чтобы указатель в структуре указывал на массив структур». Чтобы объявить указатель на массив, вам нужен немного другой синтаксис: Mesh (*meshptr)[array_size];
. В нынешнем виде ваша структура meshptr
является указателем на отдельный Mesh
объект, а не массивом. Попытка использовать этот указатель как массив вызовет проблемы, поскольку вы будете напрямую обращаться к памяти после указателя. Это может объяснить, почему перемещение указателя в конец структуры данных, похоже, работает. Когда вы делаете это, вы повреждаете память, следующую за структурой, вместо того, чтобы повреждать элементы структуры, следующие за указателем. Скорее всего, ваш код повредил одно из трех последних полей структуры, и это повреждение вызвало ошибку, которую вы видите. Перемещение указателя в конец может привести к прекращению ошибки, но это не устраняет проблему (вы по-прежнему повреждаете память, что может иметь любое количество неожиданных эффектов).
Это просто предположение, основанное на глупостях, которые я делал в прошлом. Без дополнительной части вашего кода невозможно сказать наверняка.