C 通过void**将参数传递给函数

C 通过void**将参数传递给函数,c,c89,C,C89,我试图通过函数传递参数,使用void*来提供任何类型的参数。但由于某些原因,我不明白,函数内部无法读取任何数据 这是公司职能部门的一种复制行为。 您应该将代码更改为: double doStuff(void ** args) { double ** a = (double**)args; printf("a[0] = %lf\n", *a[0]); printf("a[1] = %lf\n", *a[1]); double r = *a[0] + *a[1]

我试图通过函数传递参数,使用
void*
来提供任何类型的参数。但由于某些原因,我不明白,函数内部无法读取任何数据

这是公司职能部门的一种复制行为。


您应该将代码更改为:

double doStuff(void ** args)
{
    double ** a = (double**)args;

    printf("a[0] = %lf\n", *a[0]);
    printf("a[1] = %lf\n", *a[1]);

    double r = *a[0] + *a[1];
    return r;
}
编辑

OP要求更改
main
而不是
doStuff
(他/她不拥有)

现在,正如@Eugene Sh所指出的,函数
doStuff
被禁用,因为它要求一个双指针参数,但用作指向double的指针

main中的更改只是传递一个指向double的指针,但转换为
void**
只是为了让编译器满意:

int main(void) {

    S s;
    s.d1 = 10.0;
    s.d2 = 10.0;

    S* ptr = &s;

    double args[2];     // our pointer to double
    args[0] = ptr->d1;
    args[1] = ptr->d2;

    double d = doStuff((void**)args); // cast to void**

    printf("d = %lf\n", d);

    return 0;
}

void**
void*
不同。有趣的是:在我的例子中,我得到
a[0]=0.000000a[1]=10.000000d=10.000000
@Jean Françoisfare使用gcc或clang?
gcc
-->
double a[]={*(double*)args[0],*(double*)args[1]}
(并尝试
%lf
-->
%f
)您能解释一下吗?有没有从外部实现的方法?我真的无法修改你必须修改的功能。否则,您正在将
void**
强制转换为
double*
,这是不兼容的。@Bl4ckb0ne您忘记更改行
args[0]=&ptr->d1;args[1]=&ptr->d2
args[0]=ptr->d1;args[1]=ptr->d2(并不是说引用操作符消失了)。@rodrigo我认为强制转换不兼容的指针类型没有很好的定义。在一些奇异的系统上,它们甚至可以有不同的大小。根据标准C,该功能刚刚中断。
double doStuff(void ** args)
{
    double ** a = (double**)args;

    printf("a[0] = %lf\n", *a[0]);
    printf("a[1] = %lf\n", *a[1]);

    double r = *a[0] + *a[1];
    return r;
}
int main(void) {

    S s;
    s.d1 = 10.0;
    s.d2 = 10.0;

    S* ptr = &s;

    double args[2];     // our pointer to double
    args[0] = ptr->d1;
    args[1] = ptr->d2;

    double d = doStuff((void**)args); // cast to void**

    printf("d = %lf\n", d);

    return 0;
}