Как вы определяете длину 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 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)
Однако это только найдет позицию \0. Нет гарантии, что это фактический размер выделенного блока памяти.