因此,据我所知,我发现的每个IntPtr加法的托管示例都是错误的。
例如:http://www.atalasoft.com/cs/blogs/stevehawley/archive/2006/10/16/10987.aspx
我的想法是,如果IntPtr位于(或接近) int32.MaxValue在32位系统上,并且添加了一个溢出int32的偏移量,这不是一个有效的内存地址(因为它在uint32中是有效的,用IntPtr中的负数表示)?!
我认为代码应该是这样的:
public static IntPtr Offset(IntPtr src, int offset)
{
switch (IntPtr.Size) {
case 4:
return new IntPtr((int)((uint)src + offset));
case 8:
return new IntPtr((long)((ulong)src + offset));
default:
throw new NotSupportedException("Not supported");
}
}我疯了吗?
有人有一个尝试过的、真实的IntPtr添加示例吗?
发布于 2009-11-10 10:49:39
我认为重点是,如果您溢出一个int,您仍然得到适当的值。试试这个:
//-2147483645
Console.WriteLine( int.MaxValue + 4 );
//2147483651
Console.WriteLine( (uint)(int.MaxValue + 4) );假设int.MaxValue为2147483647,将溢出的负数转换为uint实际上会给出正确的值。
发布于 2010-04-22 16:03:34
.NET 4.0添加了一个新的静态方法IntPtr.Add(IntPtr指针,int偏移量)。
在早期的.NET版本中,转换为整数的另一种方法是使用“不安全”代码块并将IntPtr转换为(字节*)。执行您的添加,并将结果返回到IntPtr。编译器负责指针宽度的详细信息。:-)
示例:
new IntPtr((byte *)pipe.Root + EventNameOffset)或者:
(IntPtr)((byte *)pipe.Root + EventNameOffset)发布于 2009-11-10 10:31:35
在添加之前,将IntPtr转换为uint,然后应用偏移量。这将正确工作,但结果是一个long。
据我所知,不可能添加ulong和int,因此64位指针部分是不正确的。实际上,它甚至不编译。我真的想不出一个优雅的解决方案,但是仅仅使用long可能是安全的。不过,这是sh*tload内存的一半,您可以使用*,8个艾字节:)内存地址映射理论上可能是一个问题。
*:好吧,如果当前的.NET框架实现不能阻止您这样做,那么当然,在long之前:)
https://stackoverflow.com/questions/1706903
复制相似问题