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

能否仅用unistd.h库中的write函数打印指针存储的地址?

可以仅用write函数实现相同效果

完全可以,printf("%p")的核心是把指针地址转换成带0x前缀的十六进制字符串并输出到标准输出,我们可以手动完成地址到十六进制字符串的转换,再通过unistd.h的write函数输出。

实现思路

  • 将指针转换为无符号整数类型(比如unsigned long,多数系统中可兼容指针宽度),方便逐位处理。
  • 手动生成对应十六进制字符串:先添加0x前缀,再从高位到低位将每4位二进制转换为十六进制字符(小写,和标准%p的输出风格一致)。
  • 用write函数将生成的字符串写入标准输出(文件描述符为1)。

代码示例

#include <unistd.h>

int main() {
    int c = 6;
    void *ptr = &c;
    unsigned long addr = (unsigned long)ptr;
    // 缓冲区:0x + 16位十六进制(覆盖64位指针)+ 终止符
    char buf[20] = "0x";
    char *hex_chars = "0123456789abcdef";
    int bits = sizeof(void*) * 8;
    int idx = 2; // 跳过0x的位置
    
    // 从最高位开始转换每4位
    for (int i = bits - 4; i >= 0; i -= 4) {
        int nibble = (addr >> i) & 0xF;
        buf[idx++] = hex_chars[nibble];
    }
    
    // 写入标准输出
    write(1, buf, idx);
    return 0;
}

说明

  • 用unsigned long存储指针值是绝大多数现代系统的可行方案,若需严格遵循标准可使用uintptr_t(来自stdint.h,若严格限制仅用unistd.h则优先选unsigned long)。
  • 生成的十六进制字符串长度会匹配系统指针宽度(32位系统输出8位十六进制,64位输出16位),和%p的行为完全一致。
  • write的第一个参数1代表标准输出,第二个参数是存储字符串的缓冲区,第三个参数是要写入的字符数。

内容的提问来源于stack exchange,提问作者KazumaIB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:01:25