C:在标准输出上写一个指针的地址?

C: Write the address of a pointer on the standard output?

如何仅使用 write() 函数将指针的地址写入标准输出。 (类似于 printf() 函数中的 %p 标志。)

除了 'write' 'malloc' 和 'free'.

,我不能使用任何其他东西

如果你有一个像char *p;这样的指针变量,那么你可以使用

来写它
write(filedescriptor, &p, sizeof(p));

就像写任何其他变量一样。

如果要写成字符串,那么需要先格式化成字符串,然后写字符串:

char pstr[sizeof(p) * 2 + 2 + 1]; // Each byte of the pointer is two hexadecimal character, plus a potential 0x, plus terminator
snprintf(pstr, sizeof(pstr), "%p", (void *) p);
write(filedescriptor, pstr, strlen(pstr));

可以使用write将其写成字符串,方法是将指针视为普通整数值,并遍历指针变量中的所有字节并使用模和除法或移位来获取每个字节,然后使用字节掩码和移位来获取每个字节的每个半字节,并将其转换为要写入的字符。如果将指针值复制到字节数组进行迭代可能会更容易,因为这样您就不必执行 modulo/division,只需进行掩码和移位即可获取每个半字节。


但是话虽如此,我真的很好奇为什么你会想要像那样的东西?因为你不能在一个文件中保存一个指针并在另一个程序中使用它(甚至是同一个程序但 运行 作为一个新进程),你不能通过管道或套接字将它发送到另一个进程.

如果您尝试重新编码 printf,您可能想要实施 %p。使用以下步骤:

  • 从参数 va_list 中检索指针的值。
  • 将该指针转换为 uintptr_t 或任何适合目标体系结构上指针大小的无符号整数类型。
  • 将此整数转换为带有0x前缀的十六进制格式的字符串,对于%#x格式。
  • 将结果字符串写入输出文件。