【问题标题】:Passing argument by void** to function通过 void** 将参数传递给函数
【发布时间】:2017-07-04 19:12:59
【问题描述】:

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

这是公司职能的复制行为。 Live on Coliru

#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

【问题讨论】:

  • void **不与void *相同。
  • 搞笑:我得到a[0] = 0.000000 a[1] = 10.000000 d = 10.000000
  • @Jean-FrançoisFabre 使用 gcc 或 clang 吗?
  • gcc 在我的情况下。
  • double * a = (double*)args; --> double a[] = { *(double*)args[0], *(double*)args[1] };(试试%lf --> %f)

标签: c c89


【解决方案1】:

您应该将代码更改为:

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** 只是为了让编译器满意:

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 ** 转换为double*,这是不兼容的。
  • @Bl4ckb0ne 您忘记将行 args[0] = &amp;ptr-&gt;d1; args[1] = &amp;ptr-&gt;d2; 更改为 args[0] = ptr-&gt;d1; args[1] = ptr-&gt;d2; (不是引用运算符消失了)。
  • @rodrigo 我不认为强制转换不兼容的指针类型是明确定义的。它们甚至可以在一些奇异的系统上具有不同的大小。根据标准 C,该功能只是被破坏了。
猜你喜欢
  • 2021-11-19
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多