如何确定 unsigned char* 的长度?
7 回答
对于指针的实际大小:
size_t s = sizeof(unsigned char*);
如果你想要字符串的长度:
unsigned char* bla = (unsigned char*)"blabla";
int s = strlen((char*)bla);
在一个理想的世界里,你不会。您将 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 ) 找出是谁对你做了这件事,并请他们停下来。
这可能有两种含义。您是否只想知道指针类型有多大?如果是这样,那么乔斯的答案是正确的
size_t size = sizeof(unsigned char*);
如果您想知道指针指向多少个元素,那就有点复杂了。如果这是一个 C 风格的字符串,那么 strlen 或一些变体是你最好的选择。
但是,如果这只是指向与 C 样式字符串无关的 unsigned char 的指针,那么就无法可靠地实现您正在寻找的内容。C/C++ 不将长度字段与指针相关联。您需要使用指针传递长度,或者使用像 vector 这样的类来存储指针和长度。
如果您使用的是 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。
你想要指针的长度,这将是一个int。如果您想要被指向的字符串的长度,请使用 strlen: 例如指针的大小:sizeof(unsigned char*) 字符串的大小:strlen(unsigned char*) 多字节字符将被报告为 ..multi byte
如果你用c代码编译,strlen()
函数参数可以处理 “unsigned char*”;
,但在c++代码中,参数不能处理"unsigned char*";
,所以如果你用c++代码编译需要强制翻译(unsigned char*)str.
通过 unsigned char * 我想您的意思是位于该指针处的字符串。在这种情况下,它将是:
strlen(your_string_pointer)
但是,这只会找到 \0 位置。没有保证这是实际分配的内存块大小。