Printf %X 标识符 - 指针的奇怪行为
Printf %X identifier - Weird behaviour with pointers
我最近在一次面试中被问到一个问题:
查看此代码并编写其输出:
unsigned char buff[] = { 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x33, 0x33, 0x33, 0x33 };
unsigned long *pD = (unsigned long *)buff;
unsigned short *pS = (unsigned short *)buff;
void *pEnd = &buff[sizeof(buff) - 1];
for (; pD < pEnd; pD++)
printf("0x%Xn", *pD);
for (; pS < pEnd; pS++)
printf("0x%Xn", *pS);
return 0;
现在假设系统是 32 位,无符号长是 4 个字节,答案是:
- 0x11111111
- 0x22222222
- 0x33333333
- 0x1111
- 0x1111
- 0x2222
- 0x2222
- 0x3333
- 0x3333
现在回答我的问题:
为什么它只打印带有无符号短变量的 16 位?我知道无符号短是 2 个字节,但 printf 知道根据 %X 从堆栈中解析多少字节,该 %X 被读取为无符号 int。我假设它会始终读取 4 个字节(无符号 int),有时会是垃圾(或最终损坏的堆栈)。
你觉得怎么样?
谢谢!
*pS
的类型为无符号短,因此使用此值。尽管 printf 需要 %X 的 int,但您提供了一个无符号的短整型,该短整型将提升为 int。所以顺序是:从数组中读取前 2 个字节,因为 *pS 是无符号短的。然后将此无符号短值提升为 int。
输出中没有指针。通过取消引用,您告诉 printf 输出一个短文,这就是它的作用。%X 仅将其显示为十六进制。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 什么是更好的做法?通过指针或标识符传递类成员?
- 无效指针、隔离标识符等
- 用模棱两可的标识符铸造无效的指针
- Printf %X 标识符 - 指针的奇怪行为
- 指向对象的指针的未声明标识符向量
- 未声明的标识符 (newGame) - 指向函数作为参数的指针
- 链接列表头节点标识符/指针访问问题