В моей программе (C#) я использовал метод Marshal.PtrToStructure для преобразования объекта, чтобы добавить адрес памяти в структуру в цикле. В первом элементе эта работа нормальная. Но во втором элементе происходит исключение нарушения доступа.Исключение нарушения прав доступа при использовании метода Marshal.PtrToStructure в цикле
Исключение нарушения прав доступа происходит только при выигрыше 7 (64 бит), это не происходит при выигрыше xp (32 бита).
Я не знаю причину и решение для этого.
Пожалуйста, помогите мне.
Примечание: Я использую .NET Framework 3.5.
код как ниже:
[StructLayout(LayoutKind.Sequential)]
public struct gpc_vertex
{
public float x;
public float y;
};
private ArrayList DoPolygonOperation()
{
IntPtr currentVertex = vertexList.vertexes;
gpc_vertex oVertext = new gpc_vertex();
for (int j = 0; j < vertexList.num_vertices; j++)
{
PositionF pos = new PositionF();
oVertext = (gpc_vertex)Marshal.PtrToStructure(currentVertex, typeof(gpc_vertex));
//Access violation exception
pos.X = oVertext.x;
pos.Y = oVertext.y;
Marshal.DestroyStructure(currentVertex, typeof(gpc_vertex));
currentVertex = (IntPtr)((int)currentVertex.ToInt64() + Marshal.SizeOf(oVertext));
posList.Add(pos);
}
}
Спасибо.
DestroyStructure не выглядит необходимым здесь, но это не выглядит вредным либо. – Medinoc
Нет никакого способа узнать из кода, является ли currentVertex допустимым указателем, который фактически указывает на неуправляемый массив вершин с элементами num_vertices. Процессор сообщает вам, когда он недействителен, создавая исключение AccessViolationException. Кастинг IntPtr для int также очень хороший способ испортить указатель. –