Я хотел бы использовать memchr
вместо strlen
, чтобы найти длину строки C, потенциально используемой в качестве строки поддержки NSString. Является ли это безопасным, или я рискую читать память, которой я не владею, что приводит к сбою? Предположим, что NSString не будет выпущен до того, как я закончил с внутренним буфером.Могу ли я использовать memchr безопасно с внутренним символом UTF-8 *, возвращаемым из NSString?
ответ
memchr(s, 0, XXX)
и strlen(s)
должны вести себя одинаково, кроме mechr()
Способность заканчиваться после XXX байтов. Но strnlen()
может это сделать.
И это поведение, вероятно, именно то, что вы не хотите.
Ни одна из функций не учитывает кодировку любого типа в Юникоде. Таким образом, возвращаемая длина будет длиной в байтах, а не # символов.
Используйте -length
на NSString
, если вы хотите длину строки. Помимо этого, что вы пытаетесь сделать?
Это только для строки UTF-8. Я отредактировал вопрос, чтобы отразить это. – meisel
@meisel 'strlen()' даст вам длину байта, а не длину символа. Так будет 'memchr()'. Так что, опять же, очень маловероятно, что это действительно то, что вы хотите. Если вы хотите рассматривать строку как общий буфер байтов, преобразуйте ее в «NSData» или скопируйте байты в отдельный буфер изолированно от строки. – bbum
Собственно, это именно то, что я хочу. В конце концов, эта строка будет частью более крупной строки, которая затем используется для создания NSString. Моя стратегия заключается в том, чтобы принимать буферы из объектов Objective-C, обрабатывать их, рекомбинировать как NSString для пользователей API. Это очень быстро и не нужно думать о том, как работает UTF-8, за исключением того, что он заканчивается нулями. – meisel
Я не вижу причин, по которым это может быть опасно, если указатель остается в силе. Но сложный вопрос заключается в том, что вы не можете легко сказать, когда указатель освобожден, если только вы не получите его из 'NSString', тогда вы должны просто называть его' length' –
. Связанный: http://stackoverflow.com/questions/ 29473872/продолжительность жизни-оф-NSString-cstringusingencoding-возвращаемого значения. –
Почему вы не вызываете '-length' в строке напрямую? –