gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:56:09 24 4
gpt4 key购买 nike

我尝试使用 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

最佳答案

您应该将代码更改为:

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;
}

关于c - 通过 void** 将参数传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44912786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com