0

所以我正在编写自己的 printf 函数,所以我正在使用 stdarg.h 和系统调用 write()。但我不知道如何将 %p 错误地放入我的函数中。%X 会产生相同的结果吗?

我已经 %x 这样做了:

'x': x=va_arg(argp,argp, unsigned int); 
     char *temp = convert(x,16);
     write(1, temp, lengthOFtemp);
     break;

char *convert(unsigned int, int)
{
static char buf[33];
char *ptr;

ptr=&buf[sizeof(buff)-1];
*ptr='\0';
do
{
*--ptr="0123456789abcdef"[num%base];
num/=base;
}while(num!=0);

return(ptr);
}
4

2 回答 2

0

%p 和 %X 之间的区别在于指针大小是特定于平台的 - 在 64 位平台上为 8 个字节,在 32 位平台上为 4 个字节。因此,您必须使用“unsigned long”变量来处理来自 va_args 的指针参数,而不是在某些 64 位平台上保持 4 个字节的“unsigned int”。

否则是的,非常类似于您上面的 %X 代码。

于 2013-02-13T04:45:11.210 回答
0

您可能喜欢使用

void * pv = va_arg(va, void*)

从可变参数列表中拉出指针。

为了以这种方式安全地接收指针,可变参数函数的调用者(如上所示执行拉取操作)需要将指针传递为被强制转换为void *.

然后像这样转换为整数:

#include <inttypes.h>
...
uintptr_t uipv = (uintptr_t) pv;

最后调用一个转换函数:

char buff[64] = {0};
char * pc = convert_uintptr(uipv, 16);

和:

char * convert_uintptr(uintptr_t uipv, unsigned base); 
于 2013-02-13T07:17:36.513 回答