преобразование System :: String в wchar_t * - как определяется конец? - PullRequest
2 голосов
/ 25 мая 2011

Процесс объясняется здесь: http://msdn.microsoft.com/en-US/library/d1ae6tz5%28v=VS.80%29.aspx Чего я не понял из этой статьи, так это того, что закрепленный wchar_t * передается различным строковым функциям C, которые используют завершающий нулевой символ.Является ли правилом, что строки .NET имеют завершающий нулевой символ?Документы System.String говорят, что:

. В .NET Framework пустой символ может быть встроен в строку.Если строка содержит один или несколько нулевых символов, они включаются в длину всей строки.

Ответы [ 2 ]

2 голосов
/ 25 мая 2011

Из того, что я понимаю, внутренний символьный буфер в строках .NET CLR заканчивается нулем, хотя, естественно, этот нулевой символ не попадает в число символов, поэтому любой код .NET будет его игнорировать.Единственная причина, по которой null - это простое взаимодействие с Windows API или другим простым C-кодом, который ожидает, что строки заканчиваются нулем.Вместо добавления нулевого символа в любое время, когда строка .NET должна быть передана в C API (и, возможно, с необходимостью перераспределения и копирования всей строки), нулевой символ просто с самого начала - полезная оптимизация в реальном-world, поскольку .NET по-прежнему приходится много взаимодействовать за кулисами, даже если вы не используете его явно.

Если у вас действительно есть несколько нулевых символов в середине вашей строки, ну, любой C API, который получает вашу строку, вероятно, остановится на этом и никогда не достигнет конца строки.Я думаю, вы даже можете попробовать это в C ++ / CLI самостоятельно и посмотреть, что произойдет.:)

0 голосов
/ 25 мая 2011

Просто угадаю, потому что у меня нет доступа к внутренним компонентам Microsoft.

Это не указано явно, но строка wchar_t * всегда должна заканчиваться нулевым символом. Пример поддерживает это, поскольку он использует функцию printf_s, которая зависит от этой характеристики.

Функция PtrToStringChars предоставляет доступ к внутреннему строковому буферу. Функция может добавить нулевой символ в буфер без включения его в счетчик символов строки, поэтому пользователи строки .NET не увидят нулевой символ.

...