【问题标题】:correct method to get the unsigned char pointer length获取无符号字符指针长度的正确方法
【发布时间】:2017-12-14 08:07:54
【问题描述】:

我正在使用 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 *'

那么获取 unsigned char 指针大小以消除警告的正确方法是什么。

【问题讨论】:

  • 你为什么用unsigned char,这个看起来很奇怪为什么不用char
  • 这是我分享的一个示例。实际使用情况不同。
  • 我认为您应该更改您的问题以显示您的实际使用情况,因为此问题的答案可能与您的实际使用情况不正确。
  • unsigned char pointer length..我觉得不太舒服。

标签: c compiler-warnings


【解决方案1】:
strlen((const char*)tmpBuffer);

让你摆脱笔记。在这里,您将其类型转换为 strlen() 所期望的适当类型

来自standard的函数原型是

size_t strlen(const char *s);

但是在这里你传递了unsigned char* 类型的它,这就是抱怨的原因。

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

【讨论】:

    【解决方案2】:

    使用strlen 是 O(1) 问题的 O(N) 解!

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

    当然,如果数组已衰减为指针类型,则不能使用sizeof 获取长度。在这种情况下,您可以通过转换为const char* 来避免编译器警告:

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

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

    由于您的代码中有一个奇怪的地方,因此需要强制转换。字符串文字是 C 中的 const char[]not const unsigned char[]。即使char 在您的平台上是unsignedcharunsigned char 仍然是不同的类型。如果您的 sn-p 中的第一行是

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

    【讨论】:

      【解决方案3】:

      您应该能够显式转换为 char* 以消除该警告:

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

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

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

      【讨论】:

      • size_t size = sizeof(myString) / sizeof(myString[0]); => size_t size = sizeof myString / sizeof *myString - 1; => size_t size = sizeof myString - 1; 因为根据定义,sizeof(unsigned char)1
      • 不应该是size_t size = strlen((const char*)tmpBuffer);
      • @MichaelWalz 应该吗?
      • @MichaelWalz 没关系。
      • @Stargateur 是的,没关系,但 IMO 它“更正确”。
      猜你喜欢
      • 1970-01-01
      • 2011-10-16
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      • 2011-06-20
      • 1970-01-01
      • 2021-05-27
      相关资源
      最近更新 更多