2013-06-05 7 views
2

В моей программе (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); 
    } 
} 

Спасибо.

+0

DestroyStructure не выглядит необходимым здесь, но это не выглядит вредным либо. – Medinoc

+1

Нет никакого способа узнать из кода, является ли currentVertex допустимым указателем, который фактически указывает на неуправляемый массив вершин с элементами num_vertices. Процессор сообщает вам, когда он недействителен, создавая исключение AccessViolationException. Кастинг IntPtr для int также очень хороший способ испортить указатель. –

ответ

-1

Когда я меняю код, нарушение прав доступа не происходит. Однако я не понимаю причину этой проблемы. Что происходит с нарушением прав доступа?

Код изменения как ниже:

private ArrayList DoPolygonOperation() 
{ 
    IntPtr currentVertex = vertexList.vertexes; 

    gpc_vertex oVertext = new gpc_vertex(); 
    int currentOffset = 0; 
    for (int j = 0; j < vertexList.num_vertices; j++) 
    { 
    PositionF pos = new PositionF(); 
    oVertext = (gpc_vertex)Marshal.PtrToStructure((IntPtr)(currentVertex.ToInt64() + currentOffset), typeof(gpc_vertex)); 
    pos.X = oVertext.x; 
    pos.Y = oVertext.y; 
    Marshal.DestroyStructure(currentVertex, typeof(gpc_vertex)); 
    currentOffset += Marshal.SizeOf(oVertext); 

    posList.Add(pos); 
} 
} 
Смежные вопросы