2017-02-13 15 views
1

Я хотел бы использовать memchr вместо strlen, чтобы найти длину строки C, потенциально используемой в качестве строки поддержки NSString. Является ли это безопасным, или я рискую читать память, которой я не владею, что приводит к сбою? Предположим, что NSString не будет выпущен до того, как я закончил с внутренним буфером.Могу ли я использовать memchr безопасно с внутренним символом UTF-8 *, возвращаемым из NSString?

+1

Я не вижу причин, по которым это может быть опасно, если указатель остается в силе. Но сложный вопрос заключается в том, что вы не можете легко сказать, когда указатель освобожден, если только вы не получите его из 'NSString', тогда вы должны просто называть его' length' –

+1

. Связанный: http://stackoverflow.com/questions/ 29473872/продолжительность жизни-оф-NSString-cstringusingencoding-возвращаемого значения. –

+1

Почему вы не вызываете '-length' в строке напрямую? –

ответ

1

memchr(s, 0, XXX) и strlen(s) должны вести себя одинаково, кроме mechr() Способность заканчиваться после XXX байтов. Но strnlen() может это сделать.

И это поведение, вероятно, именно то, что вы не хотите.

Ни одна из функций не учитывает кодировку любого типа в Юникоде. Таким образом, возвращаемая длина будет длиной в байтах, а не # символов.

Используйте -length на NSString, если вы хотите длину строки. Помимо этого, что вы пытаетесь сделать?

+0

Это только для строки UTF-8. Я отредактировал вопрос, чтобы отразить это. – meisel

+0

@meisel 'strlen()' даст вам длину байта, а не длину символа. Так будет 'memchr()'. Так что, опять же, очень маловероятно, что это действительно то, что вы хотите. Если вы хотите рассматривать строку как общий буфер байтов, преобразуйте ее в «NSData» или скопируйте байты в отдельный буфер изолированно от строки. – bbum

+0

Собственно, это именно то, что я хочу. В конце концов, эта строка будет частью более крупной строки, которая затем используется для создания NSString. Моя стратегия заключается в том, чтобы принимать буферы из объектов Objective-C, обрабатывать их, рекомбинировать как NSString для пользователей API. Это очень быстро и не нужно думать о том, как работает UTF-8, за исключением того, что он заканчивается нулями. – meisel

 Смежные вопросы

  • Нет связанных вопросов^_^