这个过程在这里解释: http://msdn.microsoft.com/en-US/library/d1ae6tz5%28v=VS.80%29.aspx 我从那篇文章中得不到的是,固定的wchar_t *被传递给依赖于尾随空字符的各种C字符串函数。 .NET字符串是否具有尾随空字符的规则? System.String文档说:
在.NET Framework中,空字符可以嵌入到字符串中。当字符串包含一个或多个空字符时,它们将包含在总字符串的长度中。
答案 0 :(得分:2)
根据我的理解,.NET CLR字符串中的内部字符缓冲区是以空值终止的,尽管自然空字符不会使其成为字符数,因此任何.NET代码都会忽略它。 null的唯一原因是为了便于与Windows API或其他普通C代码互操作,这些代码要求字符串以空值终止。每当.NET字符串必须传递给C API(并且可能不得不重新分配和复制整个字符串)时,不是追加空字符,而是从第一位开始就是空字符 - 真实的有用优化-world,因为.NET仍然需要在幕后进行大量的互操作,即使你没有明确地使用它。
如果你碰巧在字符串的中间中有一些空字符,那么获取字符串的任何C API都可能会停在那里并且永远不会到达字符串的末尾。我想你甚至可以自己在C ++ / CLI中试一试,看看会发生什么。 :)
答案 1 :(得分:0)
猜测,因为我无法访问Microsoft内部。
没有明确说明,但是wchar_t *字符串应始终以null字符终止。该示例支持此功能,因为它使用printf_s
函数,该函数取决于此特性。
PtrToStringChars
函数授予对内部字符串缓冲区的访问权限。函数可以将空字符附加到缓冲区而不将其包含在字符串的字符数中,因此字符串的.NET用户不会看到null。