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

C# 询问C中的指针和访问内存#,c#,pointers,marshalling,dllimport,access-violation,C#,Pointers,Marshalling,Dllimport,Access Violation,我有一个问题,但我不明白,我不知道问题的根本原因。 我创建了一个小程序,当在Win7(64位)上运行它时,会发生访问冲突异常。此异常在winXP(32位)上不会发生。 之后,我更改了一些代码,访问冲突异常不会发生(在Win7和winxp上)。 我不知道异常的根本原因。 代码如下。 之前的代码(win 7上发生访问冲突异常) [StructLayout(LayoutKind.Sequential)] 公共结构gpc_顶点 { 公共浮动x; 公众浮躁; }; 私有ArrayList DopolyGo

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

[StructLayout(LayoutKind.Sequential)]
公共结构gpc_顶点
{
公共浮动x;
公众浮躁;
};
私有ArrayList DopolyGon操作()
{
IntPtr currentVertex=vertexList.vertexs;
gpc_顶点超文本=新gpc_顶点();
对于(int j=0;j
修改后的代码(不发生访问冲突异常):

private ArrayList dopolygon操作()
{
IntPtr currentVertex=vertexList.vertexs;
gpc_顶点超文本=新gpc_顶点();
int currentOffset=0;
对于(int j=0;j

请帮助我在before code查找访问冲突异常的根本原因。

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

currentVertex = (IntPtr)((int)currentVertex.ToInt64() + Marshal.SizeOf(oVertext));
在64位操作系统上,将64位值强制转换为32位int时可能会出现溢出

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

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

谢谢你的帮助。当将64位值转换为32位整数时,您能告诉我溢出的详细信息吗?如果64位数字的值大于
int.MaxValue
或小于
int.MinValue
,那么它将无法放入32位整数中,因此额外的位将丢失。我理解,这是非常多的。
currentVertex = (IntPtr)((int)currentVertex.ToInt64() + Marshal.SizeOf(oVertext));
checked
{
    currentVertex = (IntPtr)((int)currentVertex.ToInt64() + Marshal.SizeOf(oVertext));
}