【问题标题】:C++: getting a fact size of data in uchar/guchar?C++:在 uchar/guchar 中获取数据的实际大小?
【发布时间】:2010-11-15 02:18:41
【问题描述】:

问题很简单:sizeof((u_char)value) 返回 8。strlen 失败。如何获取uchar的内容长度?

尝试过

std::cout << "Data: " << (u_char *)data[0] << "\n"`;

u_char 在 include/sys/*.h 中定义为 unsigned char;

【问题讨论】:

  • 数据是如何分配的? strlen 会发生什么?
  • 如何定义价值和数据?

标签: c++ sizeof strlen unsigned-char


【解决方案1】:

sizeof() 返回存储变量所需的字节数。所以 sizeof(u_char) == 8 表示存储一个 u_char 需要 8 个字节。

您遇到分段错误的原因是因为 (u_char *)data[0] 意味着您想要数据数组中的第一个元素,然后将其视为内存地址并将数据转储到那里。因此,如果 data[0] 为 60,则您正在尝试 std::cout 内存位置 60 处的任何内容。由于此内存位置属于另一个应用程序,您会遇到分段错误(您正在查看允许的内存段之外。)

在不知道u_char是什么数据类型的情况下,无法说出如何得到它的长度。

【讨论】:

    【解决方案2】:

    问题很简单: sizeof((u_char)value) 返回 8。 strlen 失败。如何获得长度 uchar 的内容?

    我感觉u_char 是unsigned char 而value 被定义为u_char value[8] 因此,对我来说,您似乎正在尝试提取非 NULL 终止的缓冲区的长度。这就是 strlen 失败的地方。

    以下是一些基础知识:

    给定代码

    unsigned char buf[2] = {'H', 'I'}; // not NULL terminated.
    

    一个。 strlen(buf) 将给出未定义的结果,因为缓冲区“buf”中没有终止 NULL。

    b. sizeof(buf[0]) 在任何实现中都会给出 1

    c。 sizeof(buf) 将给出 2,这是为 buf 保留的内存大小。

    如果缓冲区不用于表示字符串(始终以 NULL 结尾),而只是可能被某个标记/哨兵终止的字节序列,在这种情况下,需要通过计数来计算缓冲区的长度手动标记前的元素数量(for/while/do-while 循环等)。

    顺便说一句,为什么不使用 std::vector 或 std::string?

    【讨论】:

      【解决方案3】:

      如果 data[0] 是一个标量值(例如,不是指针,尤其是指向 ASCII 或 UTF-8 文本字符串的指针),那么是的,这很可能会出现段错误。在这种情况下,您所做的是获取 data[0] 的值并告诉编译器将其视为指针。

      例如,假设您有以下内容:

      char data[256];
      strcpy(data, "Hello");
      std::cout << "Data: " << (u_char *)data[0] << "\n"`;
      

      data[0] 处的值是字符“H”,其值为 72(基数为 10)。因此,您刚刚告诉编译器将 72 视为指针,并在地址 72 处找到一个字符串,然后将其打印出来。这不太可能奏效。

      一些操作系统专门保护低地址,并在您尝试访问它们时故意进行分段错误,以让您知道您已经编写了此类错误。

      【讨论】:

        【解决方案4】:
        (sizeof(value)/sizeof(value[0])) * sizeof(u_char)
        

        【讨论】:

          猜你喜欢
          • 2020-10-08
          • 1970-01-01
          • 2013-04-11
          • 1970-01-01
          • 1970-01-01
          • 2014-03-19
          • 1970-01-01
          • 2012-10-16
          • 1970-01-01
          相关资源
          最近更新 更多