Подтвердить что ты не робот

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

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

4b9b3361

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