能否仅用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
相关产品推荐
相关产品推荐

