gpt4 book ai didi

c++ - 打印指向 uchar 值的指针

转载 作者:行者123 更新时间:2023-11-30 16:38:18 24 4
gpt4 key购买 nike

当我在 64 位机器上运行以下代码时(编译器 clang)

typedef unsigned char byte;

void foo ( byte* a ) {
std::cout << sizeof(a) << std::endl;
printf( "%x\n", a );
std::cout << a << " " << a+1 << std::endl;
}

int main() {

byte a[2];

a[0] = 'A'; a[1] = 'c';
foo( a );

return 0;
}

输出为

8
ea4c3a9a
Ac c

第一行是有意义的,因为这是一个 64 位指针。但是我不明白为什么第二行只有 4 个字节,或者最后一行。谁能指出第二条和第三条输出线背后的原因吗?

编辑:好的,那么问题是:如何正确创建以 null 结尾的字节数组,并且这样做会“更正”最后一行吗?

最佳答案

正如之前所说,该行为是未定义的。尽管如此,我们可以尝试了解这里发生的情况。第 2 行是 a 的前 4 个字节的结果。当 %x 位于文字字符串中时,printf 函数需要某种无符号类型,因此将值读入无符号 int 或 long。

第三行只是打印一个 char* 。虽然 a 最初是一个 c 字符串,但它传递给函数的是一个 unsigned char *。您可以对其执行指针算术。

例如,如果a的地址是0x1000,那么: std::cout << a将首先打印从 0x1000 到 '\0' 的字符,以及 << a + 1 部分将打印从 0x1001 开始的字符,直到到达 '\0'。

幸运的是,第三个字符(不是你的,因为 a 只有 2 个字符长)可能是“\0”。

对于您的问题,您可以非常简单地创建一个空终止字节数组。在启动时,您可以分配一个文字字符串,如下所示:

byte a[3] = "Ac";总大小为 3,因为“\0”需要 1 个字节。

或者您可以启动它 strcpy,或者如果从文件 fprintf 读取。重要的是,第三行是空终止字节*的正确输出(并且它是“偶然”发生的)。如果您觉得不合适,您可能正在寻找应该以不同方式编写的内容。

编辑:现在我明白你想要做什么(即打印 a 和 a + 1 的地址),这就是你应该如何使用 std::cout 来做到这一点:

#include <iostream>

int main()
{
unsigned char a[2];
std::cout << static_cast<void*>(a) << " " << static_cast<void*>(a + 1) << std::endl;

return 0;
}

输出为:

0x7ffcd22f9700 0x7ffcd22f9701

关于c++ - 打印指向 uchar 值的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47524334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com