如何确定unsigned char *的长度?

时间:2009-05-07 19:27:29

标签: c++ c char unsigned

如何确定无符号字符的长度*?

7 个答案:

答案 0 :(得分:29)

对于指针的实际大小:

size_t s = sizeof(unsigned char*);

如果你想要字符串的长度:

unsigned char* bla = (unsigned char*)"blabla";
int s = strlen((char*)bla);

答案 1 :(得分:9)

这可能有两个含义。你只是想知道指针类型有多大吗?如果是这样,那么Joce的答案是正确的

size_t size = sizeof(unsigned char*);

如果您想知道指针指向的元素数量,那就更复杂了。如果这是一个C风格的字符串,那么strlen或某些变体是您的最佳选择。

但是,如果这只是指向与C样式字符串无关的unsigned char的指针,那么就无法可靠地实现您正在寻找的内容。 C / C ++不会将长度字段与指针相关联。您需要使用指针传递长度或使用类似vector的类来存储指针和长度。

答案 2 :(得分:7)

在理想的世界里,你没有。你可以将char *用于C风格的字符串(它们是NUL终止的,你可以测量它的长度),而unsigned char *只用于字节数据(它的长度在另一个参数或其他任何参数中,你可能会进入尽快使用STL容器,例如vector<unsigned char>basic_string<unsigned char>)。

根本问题是您无法对char和unsigned char的存储表示是否相同做出可移植的假设。他们通常是,但他们被允许不是。因此,没有类似字符串的库函数在unsigned char *上运行,仅在char *上运行,并且将unsigned char *转换为signed char *通常并不安全,并将结果视为字符串。由于char可能已签名,这意味着不会将unsigned char *转换为char *。

但是,0在unsigned char和char中始终是相同的值表示形式。因此,在一个非理想的世界中,如果你从某个地方获得了一个C风格的字符串,但它已经作为一个无符号字符*来到,那么你(a)将它转换为char *并继续使用它,而且(b) )找出谁对你做了这件事,并请他们停下来。

答案 3 :(得分:0)

你想要指针的长度,这将是一个int。如果您想要指向的字符串的长度,请使用strlen: 例如 指针大小:sizeof(unsigned char *) 字符串的大小:strlen(unsigned char *) 多字节字符将报告为..multi byte

答案 4 :(得分:0)

如果您正在使用C ++,并且它是一个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。

答案 5 :(得分:0)

如果您使用C代码进行编译,则strlen()函数参数可以处理“unsigned char*”; 但是在C ++代码中,参数无法处理"unsigned char*"; 因此,如果您使用c ++代码进行编译,则需要强制翻译(unsigned char*)str.

答案 6 :(得分:-3)

通过unsigned char *我想你的意思是指向该指针的字符串。在那种情况下,它将是:

strlen(your_string_pointer)

但是,这只会找到\ 0位置。没有保证这是实际分配的内存块大小。