You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅用unistd.h通过write()输出指针地址的十六进制形式

指针地址十六进制输出实现(仅用<unistd.h>)

核心思路

不能用printf的话,就依托unistd.h提供的write函数直接输出字符。关键是把指针的数值转换成十六进制字符串:

  1. 将指针转换为unsigned long long类型(保证能容纳所有平台的指针值);
  2. 逐位提取整数的4位二进制(对应1位十六进制),映射到对应字符;
  3. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:55:07