打印指针到chuchar的值

Printing pointer-to-uchar values

本文关键字:的值 chuchar 指针 打印      更新时间:2023-10-16

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

typedef unsigned char byte;
void foo ( byte* a ) {
    std::cout << sizeof(a) << std::endl;
    printf( "%xn", 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终止的字节数组,并且会这样做"正确"最后一行?

如前所述,行为不确定。但是,我们可以尝试了解这里发生了什么。第二行是a的前4个字节的结果。当%x位于文字字符串中时,printf函数会期望某些未签名类型,因此将值读取为无符号的int或long。

第三行只是字符*的打印。尽管A最初是C字符串,但它传递给了无符号字符 *的函数。您可以在其上执行指针算术。

例如,如果A的地址为0x1000,则: std::cout << a将首先从0x1000打印直到到达' 0',零件<< a + 1将从0x1001打印字符,直到达到' 0'。

幸运的是,第三个char(不是 yours ,因为A只有2个字符)可能是' 0'。

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

byte a[3] = "Ac";总尺寸为3,因为您需要一个字节,以" 0"。

,也可以启动它,或者从文件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