繁体   English   中英

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

[英]Passing argument by void** to function

我试图通过使用void *的函数传递参数以给出任何类型的参数。 但是由于某些我不了解的原因,该函数内部无法读取任何数据。

这是公司功能的重现行为。 住在科利鲁

#include <stdio.h>

typedef struct
{
    double d1, d2;
} S;

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;

    void* args[2];
    args[0] = &ptr->d1;
    args[1] = &ptr->d2;

    double d = doStuff(args);

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

    return 0;
}

它的输出

a[0] = 0.000000
a[1] = 0.000000
d = 0.000000

您应该将代码更改为:

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受到限制,因为它要求使用双指针参数,但用作双精度指针。

main的更改只是传递了一个指向double的指针,但是将其void**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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM