你如何操作在 C 中的可变参数函数中作为参数传递的 void 指针

How do you manipulate a void pointer passed as a parameter in a variadic function in C

我有以下可变参数函数(vsprintf 的一个版本):

buf[size] = '0'; size++;                
buf[size] = 'x'; size++;
void **ptr = va_arg(arg, void *);
num = unsigned_to_base(&buf[size], bufsize, (int)*ptr, HEX_BASE, 8);

其中函数 unsigned_to_base() 接收十六进制数并将其作为字符串放入 buf 中(0x 前缀必须手动放置,因为该函数不会自动放置。 unsigned_to_base函数如下:

int unsigned_to_base(char *buf, size_t bufsize, unsigned int val, int base, int min_width) 其中 buf 是目标,bufsizebuf 的大小,val 是所讨论的值,base 是表示字符串的基数系统as(在本例中为 16 进制,十六进制),min_width 是输出字符串的最小宽度,如果需要,用前导 0 填充前面。函数 returns 写入 buf.

的字符数

我在可变参数函数中提取的参数是 (void *) 0x20200004,我正在尝试 return "0x20200004"。但是,我收到的实际 return 值是 "0x00012000"。我做错了什么?

谢谢!

va_arg returns 作为参数给出的类型的值。您的 va_arg returns a void*,但您将其存储在 void** 中,我认为这不是您想要的。另外,我看到你有 C++ 标签,那你为什么还要在 C++ 中使用可变列表?

当您调用 unsigned_to_base 时,您会取消引用 ptr,这会为您提供地址 0x20200004 处的值。您反而想要值 0x20200004,所以不要取消引用:

num = unsigned_to_base(&buf[size], bufsize, (int)ptr, HEX_BASE, 8);