Tag: pointers

调试器将指针类型静态字段的值显示为零0x0,而实际上它具有有效值

我尝试使用类型uint*访问struct的静态字段的值时遇到此行为 在调试时,监视窗口将静态字段StaticBitMask的值显示为零,但实际上(并且如预期的那样)它是一个有效指针,并且Console.WriteLine()打印它,如下面的控制台输出中所示: Pointers: —————– Static bitmask pointer: 0x706790 Instance bitmask pointer: 0x708A20 Values: —————– Static bitmask pointer val: 0xFFFFFFFF Instance bitmask pointer val: 0xFFFFFFFF 固定实例字段未观察到此不一致行为。 对于那些,可以在观察窗口中看到实际值并打印出来。 为什么会这样? 我知道顺便说一句,这不是一个表明,但为什么,一个奇迹。 此外,在结构中使用指针类型的静态字段会带来什么后果? 由于它不能被标记为fixed ,它是否可能随时随地移动购买GC? 以下是源代码,您可以直接作为控制台应用程序运行以重现问题。 谢谢。 using System; using System.Runtime.InteropServices; public unsafe struct UIntBitMask { private static int uintNumberOfBits = sizeof(uint) * 0x8; public static uint* StaticBitMask; public […]

C#Endian敏感吗?

例如,C#是否对Endian敏感,将代码如下: int a = 1234567; short b = *(short*)&i; 始终为b分配相同的值。 如果是这样,它会有什么价值? 如果没有,如果带有指针的代码,有什么好方法可以处理字节序?

为什么*(int *)0 = 0导致访问冲突?

出于教育目的,我正在编写一组方法,这些方法会导致C#中的运行时exception,以了解所有exception是什么以及导致它们的原因。 现在,我正在修补导致AccessViolationException程序。 对我来说最明显的方法是写入受保护的内存位置,如下所示: System.Runtime.InteropServices.Marshal.WriteInt32(IntPtr.Zero, 0); 正如我所希望的那样,这AccessViolationException了一个AccessViolationException 。 我想更简洁地做到这一点,所以我决定编写一个带有不安全代码的程序,并通过为零指针赋值来做(我认为的)完全相同的事情。 unsafe { *(int*)0 = 0; } 由于无法理解的原因,这会抛出NullReferenceException 。 我玩了一些,发现使用*(int*)1而不是抛出NullReferenceException ,但如果使用负数,如*(int*)-1 ,它将抛出一个AccessViolationException 。 这里发生了什么? 为什么*(int*)0 = 0会导致NullReferenceException ,为什么它不会导致AccessViolationException ?

修复了带锯齿数组的语句

我有锯齿状的数组,我需要传递给外部方法。 [DllImport(…)] private static extern int NativeMethod(IntPtr[] ptrArray); … fixed (ulong* ptr = array[0]) { for (int i = 0; i < array.Length; i++) { fixed (ulong* p = &array[i][0]) { ptrArray[i] = new IntPtr(p); } } NativeMethod(ptrArray); } 问题是ptr未使用,因编译而被删除。 根据它的固定声明也被删除。 所以数组被GC移动,使得ptrArray元素变为无效。 将锯齿状数组作为指向本机方法的指针的一维数组传递的最佳方法是什么? 更新: 这是NativeMethod的C ++代码: NativeClass::NativeMethod(const int* array)

无法在Unity中编组从C ++到C#的结构数组

我正在尝试将C ++中的struct数组传递给C#中的Unity脚本。 当我在生产中使用代码时,数组的大小会有很大差异,所以我实际上需要传递一个未知长度的数组。 我的聪明想法是将数组存储在堆上,并将对该数组的引用传递给Unity。 我发现StackOverflow的post就是如何做到的。 但是然后Unity抱怨引用为null。 这是我的C ++代码的一部分: extern “C” struct S; // Not currently used. struct S { int i; float f; }; extern “C” bool helloWorld(S ** a, int * i); S * s; bool helloWorld(S ** a, int * i) { s = new S[4]; for (int j = 0; j < […]

C#:指向多个整数的引用/指针数组

我想在数组中引用一些短路。 我以为我可以创建短裤,然后将它们添加到arrays中。 所以…每次更改引用的对象时,都会反映在数组中,反之亦然。 做一些试验使我确信它不是那么有效。 事实上,看起来价值是转移而不是参考。 下面的代码创建了两个short,将这些作为对象添加到数组中,然后更改原始short。 但是,当访问数组中假定的引用short时它没有改变,这使我相信它是一个与原始对象无关的全新对象。 Console.WriteLine(“Testing simple references:”); short v1 = 1; short v2 = 2; object[] vs = new object[2]; vs[0] = v1; vs[1] = v2; v1 = 1024; v2 = 512; Console.WriteLine(” v1: ” + (short)vs[0]); Console.WriteLine(” v2: ” + (short)vs[1]); 我在这里误解了一些基本的东西,如果有人可以解释,我会很感激,并且可能会指出一个可以做我想做的解决方案。

值类型和引用类型之间的基本区别

可能重复: C#中的值类型和引用类型有什么区别? 值类型和重新引用类型之间的基本差异是什么

使用ref与C类#

我想给我正在制作的课程提供一个链接列表。 我希望该类写入该列表(例如,通过.addLast())。 我应该使用ref关键字吗? 我对在C#中使用ref和out关键字的位置感到有些困惑,因为所有类都是在堆上动态分配的,我们实际上使用指针进行大多数操作。 当然, out和ref关键字对于原语和结构是有意义的。 另外,如果我不直接发送列表,但发送包含列表的类? (这是internal和需要的),我还需要使用ref吗? 或者如果我在函数之间传递它,ex: void A(ref LinkedList list){ B(list); } void B(ref LinkedList list){ _myList = list; }