2011-05-24 30 views
2

这个过程在这里解释: http://msdn.microsoft.com/en-US/library/d1ae6tz5%28v=VS.80%29.aspx 我从那篇文章没有得到的是固定的wchar_t *被传递给依赖尾随空字符的各种C字符串函数。 .NET字符串是否有尾随空字符的规则? System.String文档说:将System :: String转换为wchar_t * - 如何确定结束?

在.NET Framework中,空字符可以嵌入到字符串中。当一个字符串包含一个或多个空字符时,它们包含在总字符串的长度中。

回答

2

据我了解,在.NET CLR字符串内部字符缓冲区是空值终止的,虽然这自然空字符不使其进入字符计数,所以任何.NET代码会忽略它。这个null的唯一原因是可以轻松地与Windows API或其他纯C代码进行互操作,这些代码需要字符串以null结尾。相反,追加空字符任何时候一个.NET字符串将被传递到一个C API(也可能有重新分配并复制整个字符串),空字符就在那里从第一地方 - 在真实有用的优化因为.NET仍然需要在幕后进行大量的互操作,即使你没有明确地使用它。

如果你碰巧在你的字符串的中间中有一些空字符,那么任何得到你的字符串的C API都可能会停在那里,永远不会到达字符串的末尾。我想你甚至可以自己尝试在C++/CLI中看看会发生什么。 :)

+0

实际上,当我检索System :: String的wchar_t *时,在文本结束之后和空字符之前看到一对垃圾字符。也许这与字符串来自Windows.Forms.TextBox的事实有关? – andriej 2011-05-24 22:49:15

+0

也许,虽然我不明白为什么。 Windows.Forms.TextBox的文本当然必须通过Windows API(这将要求它以空终止),但我不知道为什么你会在那里得到垃圾。 – 2011-05-24 23:22:25

0

只是猜测,因为我没有获得微软内部。

它没有明确规定,但为wchar_t *字符串应始终以空字符终止。这个例子支持这个,因为它使用依赖于这个特性的printf_s函数。

PtrToStringChars功能授权访问内部字符串缓冲区。该函数可能会将空字符添加到缓冲区中,而不将其包含在字符串的字符数中,因此字符串的.NET用户将看不到null。

+0

PtrToStringChars()在[vcclr.h]中定义(http://www.google.com/codesearch/p?hl=en#ep_dW72sfTE/trunk/trunk/include/ntddk/inc/ddk/ wlh/vcclr.h&q = file:vcclr.h&sa = N&cd = 1&ct = rc)包含文件,因此您可以自己查看。它似乎没有将字符附加到字符串缓冲区或以任何方式进行修改。它只是给你指向内部字符缓冲区的指针。 – 2011-05-24 21:19:30

+0

@Boaz Yaniv,感谢您的链接。我没有看到任何追加。我必须假定其他字符串函数在缓冲区末尾保留一个空值,而不将其包含在字符数中。 – 2011-05-24 21:23:26

+0

有几乎有关的任何信息,但一些文章中,我发现了讨论这个问题似乎[表明](http://csharpindepth.com/Articles/General/Strings.aspx)。 – 2011-05-24 21:31:04