打印指针到chuchar的值
Printing pointer-to-uchar values
当我在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
相关文章:
- 数组索引的值没有增加
- 'short int'持有的值溢出,但"自动"不会溢出?
- 是默认情况下分配给char数组常量的值
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 为什么我无法更改"set<set>"循环中的值<int>
- 有效地使用std::unordered_map来插入或增加键的值
- <streamsize>C++ 中 numeric_limits::max() 的值
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 无法获取webot::PositionSensor对象中位置传感器的值
- 正在将无序映射设置为无序映射的值
- 着色器纹理值与创建纹理时写入的值不同
- 无法按cpp中的值返回矢量
- 指针没有更新它在void函数内部指向的值
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 如何在c++中获取要更新的值
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 打印指针到chuchar的值