在C#中询问指针和访问内存

时间:2013-06-06 08:18:25

标签: c# pointers marshalling dllimport access-violation

我有一个问题,但我不明白,我不知道问题的根本原因。 我讨厌一个小程序,当它在win 7(64位)上运行时,会发生访问冲突异常。 winXP(32位)上不会发生此异常。 之后,我更改了一些代码并且没有发生访问冲突异常(在win 7和winxp上都有)。 我没有异常的根本原因。 代码如下。 之前的代码(在win 7上发生访问冲突异常)。

[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);
}
}

修改后的代码(不会发生访问冲突异常):

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);
}
}

请帮助我在代码之前找到访问冲突异常的根本原因。

1 个答案:

答案 0 :(得分:0)

我认为你的问题可能就在这一行:

currentVertex = (IntPtr)((int)currentVertex.ToInt64() + Marshal.SizeOf(oVertext));

在64位操作系统上,当您将64位值转换为32位int时,可能会出现溢出。

要确定是否是这种情况,请在其周围放置checked并测试它以查看是否会引发溢出异常:

checked
{
    currentVertex = (IntPtr)((int)currentVertex.ToInt64() + Marshal.SizeOf(oVertext));
}