如何直接修改VA_LIST结构成员

How to directly modify va_list structure members?

本文关键字:LIST 结构 成员 VA 何直接 修改      更新时间:2023-10-16

如下所述,va_list类型的实现如下

typedef struct {
   unsigned int gp_offset;
   unsigned int fp_offset;
   void *overflow_arg_area;
   void *reg_save_area;
} va_list[1];

我可以直接修改va_list变量的结构成员吗?

va_list ap; 
ap[0].gp_offset = 123;   // I want something like this
ap->gp_offset = 123;     // but none of these compile

当我尝试运行此问题时,我分别得到这些错误

error: request for member 'gp_offset' in 'ap[0]', which is of non-class type '__va_list_tag'

error: request for member 'gp_offset' in '*(__va_list_tag*)(& ap)', which is of non-class type '__va_list_tag'

我为什么要问?我正在使用一个大数据库,我看到了一种有点骇人听闻的方法来修改va_list变量如下。我想知道这是否可以在没有所有这些麻烦的情况下完成。

va_list ap;
// Mimic GCC data structure
typedef struct {
   unsigned int gp_offset;
   unsigned int fp_offset;
   void *overflow_arg_area;
   void *reg_save_area;
}va_list2[1];
char* ap2 = (char*)≈         // same address as ap
va_list2* ap3 = (va_list2*)ap2; // same address as ap
(*a3)->gp_offset = 123;         // Now this is allowed!

该答案是针对c问题的,但即使在技术上也是不正确的。

va_list是什么,两种语言都没有定义。您可能能够执行某些编译器/库/ABI的特定操作,但我的建议是找到另一种方法来做您要做的任何事情。