Как вы определяете длину unsigned char *?

Вопрос:Как вы определяете длину unsigned char *? Ответ №1Для фактического размера указателя: size_t s = sizeof(unsigned char*); Если вам нужна длина строки: unsigned char* bla = (unsigned char*)"blabla"; int s = strlen((char*)bla); Ответ №2Для этого может быть два значения. Вы просто хотите узнать, насколько велика тип указателя? Если это так, то ответ Joce правильный size_t

Вопрос:

Как вы определяете длину unsigned char *?

Ответ №1

Для фактического размера указателя:

size_t s = sizeof(unsigned char*);

Если вам нужна длина строки:

unsigned char* bla = (unsigned char*)»blabla»; int s = strlen((char*)bla); Ответ №2

Для этого может быть два значения. Вы просто хотите узнать, насколько велика тип указателя? Если это так, то ответ Joce правильный

size_t size = sizeof(unsigned char*);

Если вы хотите знать, сколько элементов указывает указатель, это немного сложнее. Если это строка стиля C, то strlen или какой-то вариант – ваш лучший вариант.

Однако, если это всего лишь указатель на unsigned char, который не имеет отношения к строке стиля C, тогда нет способа надежно достичь того, что вы ищете. C/С++ не связывает поле длины с указателем. Вам нужно будет передать длину с помощью указателя или использовать вектор типа, который хранит как указатель, так и длину.

Ответ №3

В идеальном мире вы этого не делаете. Вы используете char * для строк стиля C (которые имеют NUL-конец и вы можете измерить длину), а unsigned char * – только для данных байта (который поставляется с его длиной в другом параметре или что угодно, и что вы, вероятно, попадете в контейнер STL ASAP, например vector<unsigned char> или basic_string<unsigned char>).

Коренная проблема заключается в том, что вы не можете делать переносные предположения о том, являются ли представления хранилища char и unsigned char одинаковыми. Они обычно есть, но им разрешено не быть. Таким образом, нет строковых библиотечных функций, которые работают с unsigned char *, только на char *, и в общем случае безопасно отличать unsigned char * с подписанным char * и обрабатывать результат как строка. Поскольку char может быть подписан, это означает, что без кавычек unsigned char * to char *.

Однако, 0 всегда одно и то же представление значения в unsigned char и char. Поэтому в неидеальном мире, если у вас есть строка стиля C откуда-то, но она появилась как unsigned char *, то вы (а) добавили ее в char * и продолжаете с ней, но также (б) узнайте, кто сделал это с вами, и попросите их, пожалуйста, прекратить.

Ответ №4

Вы хотите, чтобы длина указателя, которая была бы int. Если вы хотите указать длину строки, на которую указывает указатель, используйте параметр strlen:
например
Размер указателя: sizeof (без знака char *)
Размер строки: strlen (без знака char *)
Многобайтные символы получаются как:.multi byte

Ответ №5

Если вы используете С++ и строку в unsigned char *, вам лучше сначала вставить его в std::string, прежде чем манипулировать им. Таким образом, вы можете делать с ним всевозможные вещи и по-прежнему иметь возможность получать длину() и/или емкость(), когда захотите.

Я предполагаю, что вы делаете вещи в указанном массиве, чтобы сделать его размер непостоянным. Если вы просто выделяете, устанавливаете и забываете, вы всегда можете сохранить фактический размер распределения массива в отдельной переменной – или лучше, создать struct/class.

//WARNING: memory issues not addressed here. struct myStringStruct { unsigned char * string; int len; allocate(int size) { len = size; string = malloc(sizeof(unsigned char) * len); } }

Более сложный, чем этот, и вы повторно изобретаете std::string.

Ответ №6

Без знака char * Предположим, вы имеете в виду строку, расположенную на этом указателе. В этом случае это будет:

strlen(your_string_pointer)

Однако это только найдет позицию . Нет гарантии, что это фактический размер выделенного блока памяти.

Оцените статью
Добавить комментарий