可变参数的一些讨论
现象:
函数A定义了一个双指针的固定参数然后是可变参数: int A( void **pHandle,...);
A函数在一个动态链接库中被实现。
调用的时候,第一次在main函数中直接调用这个函数,且固定参数为一个全局变量,设计中的几种参数组合都可以正常调用。
第二次调用的时候只是将第一次的main函数名字改掉并重新写一个main函数来调用该函数,但是发现在进入到A函数后,存储参数地址列表的内存中,跟在有效参数地址后面的值不再是0,从而导致获取参数时无法正常获取。
不知道文字描述是不是清楚,简单用代码描述下。
/*
* A.h
*/
...
DLL int A( void **pHandle,... );
...
/*
* 调用正常
*/
...
void *handle = NULL;
void main()
{
int rv = 0;
{
rv = A(&handle);/*这种方式在函数A中跟踪到内存(&pHandle+4)的地方值是0*/
...
}
{
rv = A(&handle,"config.ini");
...
}
{
rv = A(&handle,"127.0.0.1",8000);
...
}
return;
}
/*
* 调用异常
*/
...
void *handle = NULL;
void initdll()
{
int rv = 0;
{
rv = A(&handle);/*这种方式在函数A中跟踪到内存(&pHandle+4)的地方值是一个非0值,且该值所指向的地址也有值。*/
...
}
{
rv = A(&handle,"config.ini");
...
}
{
rv = A(&handle,"127.0.0.1",8000);
...
}
return;
}
void main()
{
initdll();
return;
}
static void ad1843_read_multi(struct snd_ad1843 *ad1843, int argcount, ...)
{
va_list ap;
const struct ad1843_bitfield *fp;
int w = 0, mask, *value, reg = -1;
va_start(ap, argcount);
while (--argcount >= 0) {
fp = va_arg(ap, const struct ad1843_bitfield *);
value = va_arg(ap, int *);
if (reg == -1) {
reg = fp->reg;
w = ad1843->read(ad1843->chip, reg);
}
mask = (1 << fp->nbits) - 1;
*value = w >> fp->lo_bit & mask;
}
va_end(ap);
}