0

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

已尝试

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

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

4

4 回答 4

1

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

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

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

于 2010-11-15T02:45:18.253 回答
1

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

我有一种感觉,并且u_char被定义为 所以,对我来说,看起来你正在尝试提取不是 NULL 终止的缓冲区的长度。这就是 strlen 失败的地方。unsigned charvalueu_char value[8]

以下是一些基础知识:

给定代码

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

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

湾。sizeof(buf[0]) 将在任何实现中给出 1

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

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

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

于 2010-11-15T02:52:34.357 回答
0

如果 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 处找到一个字符串,然后将其打印出来。这不太可能奏效。

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

于 2010-11-15T02:41:45.707 回答
0
(sizeof(value)/sizeof(value[0])) * sizeof(u_char)
于 2010-11-15T03:05:42.363 回答