你如何操作在 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
是目标,bufsize
是 buf
的大小,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);
我有以下可变参数函数(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
是目标,bufsize
是 buf
的大小,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);