Aru*_*run 1 c compiler-warnings
我正在使用 strlen 函数来获取无符号字符指针的长度。但是 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 *'
Run Code Online (Sandbox Code Playgroud)
那么获取无符号字符指针大小以消除警告的正确方法是什么。
strlen((const char*)tmpBuffer);
Run Code Online (Sandbox Code Playgroud)
让你摆脱笔记。在这里,您将其类型转换为期望的适当类型strlen()
从标准来看,函数的原型是
size_t strlen(const char *s);
Run Code Online (Sandbox Code Playgroud)
但是在这里你传递了它的类型unsigned char*,这就是抱怨的原因。
此外,如果您使用它来简单地存储字符串,如示例所示。您可以char毫无问题地使用。
使用strlen是 O(1) 问题的 O(N) 解决方案!
数组的大小在编译时是已知的。使用习语sizeof(myString)。这是包括NUL 终止符的长度,因此将比strlen结果大 1。
当然,sizeof如果数组已衰减为指针类型,则不能使用获取长度。在这种情况下,您可以通过使用强制转换来消除编译器警告const char*:
size_t size = strlen((const char*)tmpBuffer);
Run Code Online (Sandbox Code Playgroud)
注意 NUL 终止符不包括在计数中。
由于代码中的一个奇怪之处,因此需要强制转换。字符串文字const char[]在 C 中是 of ,而不是 const unsigned char[]. 即使char是unsigned你的平台上,char并且unsigned char仍然是不同的类型。如果您的代码段中的第一行是
const char myString[] = "This is my string";
Run Code Online (Sandbox Code Playgroud)