如何仅用unistd.h通过write()输出指针地址的十六进制形式
指针地址十六进制输出实现(仅用<unistd.h>)
核心思路
不能用printf的话,就依托unistd.h提供的write函数直接输出字符。关键是把指针的数值转换成十六进制字符串:
- 将指针转换为
unsigned long long类型(保证能容纳所有平台的指针值); - 逐位提取整数的4位二进制(对应1位十六进制),映射到对应字符;
- 用
write把生成的16位十六进制字符串输出到标准输出。
实现代码
#include <unistd.h> void print_pointer(void *ptr) { char hex_buf[16]; unsigned long long addr_val = (unsigned long long)ptr; const char hex_digits[] = "0123456789abcdef"; // 从最高位到最低位填充缓冲区 for (int i = 15; i >= 0; i--) { hex_buf[i] = hex_digits[addr_val & 0x0F]; addr_val >>= 4; } // 输出16位十六进制字符串到标准输出 write(STDOUT_FILENO, hex_buf, 16); } // 测试示例 int main() { int x; print_pointer(&x); write(STDOUT_FILENO, "\n", 1); // 可选添加换行 return 0; }
关键细节说明
- 直接转
char*失败的原因:把指针转char*是去访问指针指向的内存内容,而非获取指针本身的数值,自然无法输出地址。 - 位数兼容:64位系统指针对应16位十六进制,32位系统对应8位,代码固定输出16位会自动补前导零,完全匹配你给出的示例格式。
- 大写格式调整:如果需要输出大写十六进制,把
hex_digits改成"0123456789ABCDEF"即可。
内容的提问来源于stack exchange,提问作者arzel
相关产品推荐
相关产品推荐

