Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET封送处理.PtrToStringUni(IntPtr)与新字符串(char*)_C#_.net_String_Marshalling - Fatal编程技术网

C# .NET封送处理.PtrToStringUni(IntPtr)与新字符串(char*)

C# .NET封送处理.PtrToStringUni(IntPtr)与新字符串(char*),c#,.net,string,marshalling,C#,.net,String,Marshalling,除了使用char*和使用IntPtr这一明显事实之外,和之间的区别是什么?我什么时候应该用哪个 我记得大约几年前,当我使用构造函数时,我发现了一个真正的随机访问违规行为,花费了大量的时间来追踪,而当我使用PtrToStringUni时,它就消失了。也许这不是真正的原因,我不知道,但似乎是 不过,我从来没有弄清楚区别是什么。有什么想法吗 编辑: 回答了我的大部分问题;但是:我的访问违规有什么解释吗?或者是因为其他原因吗?区别在于,如果不使用不安全的代码,就不能使用指针。char*是一个实际的指针

除了使用
char*
和使用
IntPtr
这一明显事实之外,和之间的区别是什么?我什么时候应该用哪个

我记得大约几年前,当我使用构造函数时,我发现了一个真正的随机访问违规行为,花费了大量的时间来追踪,而当我使用
PtrToStringUni
时,它就消失了。也许这不是真正的原因,我不知道,但似乎是

不过,我从来没有弄清楚区别是什么。有什么想法吗


编辑:
回答了我的大部分问题;但是:我的访问违规有什么解释吗?或者是因为其他原因吗?

区别在于,如果不使用不安全的代码,就不能使用指针。char*是一个实际的指针。IntPtr包装一个指针

从您链接的msdn:

如果指定的数组不是以null结尾的,则此构造函数的行为依赖于系统。例如,这种情况可能导致访问冲突


您的char[]null是否已终止?

根据链接的答案,我可以猜测您没有将指针固定到char*,这导致(随机)GC在构造函数仍在运行时移动char*,从而导致访问冲突。猜一猜:)

replicate,@adontz:噢,哇,你说得对——不过这并不能解释访问违规的原因。我会编辑。我以为你没有使用不安全的,但显然,没有它,构造函数甚至不会出现。编辑了我的答案。