34

如何确定 unsigned char* 的长度?

4

7 回答 7

46

对于指针的实际大小:

size_t s = sizeof(unsigned char*);

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

unsigned char* bla = (unsigned char*)"blabla";
int s = strlen((char*)bla);
于 2009-05-07T19:28:48.363 回答
10

在一个理想的世界里,你不会。您将 char* 用于 C 风格的字符串(以 NUL 结尾,您可以测量其长度),而 unsigned char* 仅用于字节数据(在另一个参数或其他参数中带有长度,您可能会进入STL 容器 ASAP,例如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 风格的字符串,但它作为一个 unsigned char* 到达,那么你 (a) 将它转换为 char* 并继续它,但也 (b ) 找出是谁对你做了这件事,并请他们停下来。

于 2009-05-08T01:30:03.083 回答
9

这可能有两种含义。您是否只想知道指针类型有多大?如果是这样,那么乔斯的答案是正确的

size_t size = sizeof(unsigned char*);

如果您想知道指针指向多少个元素,那就有点复杂了。如果这是一个 C 风格的字符串,那么 strlen 或一些变体是你最好的选择。

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

于 2009-05-07T19:31:44.613 回答
1

如果您使用的是 C++,并且它是 unsigned char* 中的字符串,则最好先将其放入 std::string 中,然后再对其进行操作。这样你就可以对它做各种各样的事情,并且仍然可以随时获得它的长度()和/或容量()。

我假设您正在对所述数组做一些事情以使其大小不恒定。如果您只是分配、设置和忘记,您始终可以将数组的实际分配大小存储在单独的变量中 - 或者更好的是,创建一个结构/类。

//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。

于 2009-05-07T19:41:22.657 回答
0

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

于 2009-05-07T19:31:59.543 回答
0

如果你用c代码编译,strlen()函数参数可以处理 “unsigned char*”; ,但在c++代码中,参数不能处理"unsigned char*"; ,所以如果你用c++代码编译需要强制翻译(unsigned char*)str.

于 2020-02-26T04:11:21.447 回答
-4

通过 unsigned char * 我想您的意思是位于该指针处的字符串。在这种情况下,它将是:

strlen(your_string_pointer)

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

于 2009-05-07T19:30:27.893 回答