获取unsigned char指针长度的正确方法

时间:2017-12-14 08:07:54

标签: c compiler-warnings

我使用strlen函数来获取unsigned char指针的长度。但VS编译器会抛出以下警告。

unsigned char myString[] = "This is my string";
unsigned char* tmpBuffer = &myString[0];
size_t size = strlen(tmpBuffer);

warning C4057: 'function' : 'const char *' differs in indirection to slightly different base types from 'unsigned char *'

那么获取无符号字符指针大小以摆脱警告的正确方法是什么。

3 个答案:

答案 0 :(得分:4)

rm

让你摆脱这个音符。在这里,您将其类型转换为strlen((const char*)tmpBuffer);

所期望的适当类型

standard开始,函数的原型是

strlen()

但是在这里你传递了size_t strlen(const char *s); 类型,这就是抱怨的原因。

此外,如果您使用它来简单地存储字符串,如示例所示。您可以毫无问题地使用unsigned char*

答案 1 :(得分:4)

使用strlen是对O(1)问题的O(N)解决方案!

编译时中已知数组的大小。使用成语sizeof(myString)。这是NUL终结符的长度包括,因此将比strlen结果大1。

当然,如果数组衰减指针类型,则无法使用sizeof来获取长度。在这种情况下,您可以使用转换为const char*

来避免编译器警告
size_t size = strlen((const char*)tmpBuffer);

注意到计数中包含 的NUL终止符。

由于代码中的奇怪性,需要进行演员表。字符串文字在C中为const char[]不是 const unsigned char[]。即使您平台上charunsignedcharunsigned char仍然是不同的类型。如果您的代码段中的第一行是

,那会更好
const char myString[] = "This is my string";

答案 2 :(得分:1)

您应该能够明确地转换为char*以消除该警告:

size_t size = strlen((char*)tmpBuffer);

或者,由于tmpBuffer是您所在范围内声明的数组,因此您可以使用sizeof运算符:

size_t size = sizeof(myString) / sizeof(myString[0]) - 1;