将void指针转换为double

8

我正在尝试使用 pthread 库来计算 n 个斐波那契数,其中 n 的范围可以是 0-1000。当我尝试将我的 void* 强制转换为 double 时遇到了奇怪的错误。

在我的主函数中,这是我调用计算斐波那契数的函数:

pthread_create(&tid, &attr, calc_fib, (void *)n);

在我的calc_fib函数中,我试图使用类型转换:
void *calc_fib( void *num)
{
    double n;
    n = (double)num;
    ...

然而,当我尝试这样做时,我会得到以下错误:
In function ‘calc_fib’:
error: pointer value used where a floating point value was expected
In function ‘main’:
error: cannot convert to a pointer type

我在C语言中是否无法将 void* 强制转换为 double,还是我只是做错了?
3个回答

15

void *num是一个指针。 double n是一个变量。

你可以将void*强制类型转换为double*

double *p = (double *)num;

然后您对其进行取消引用:

double n = *p;

或者一行:

double n = *(double *)num;

没错,就是这样。我总是忘记在不同指针类型之间进行类型转换的微妙之处。 - user670595

3

首先,您需要将void*转换为double*。然后,您需要取消引用指针并将其分配给double。

void *calc_fib( void *num)
{
    double n;
    n = *(double*)num;
    ...

1

你不能将double直接转换为指针 - 首先,指针类型可能没有足够的位数。

如果在调用pthread_create后,nmain中不会被更改,则可以将指向mainn变量的指针传递给新线程(即(void*)&n),然后在calc_fib中使用*(double*)num

如果n可能会更改 - 也许您有一个循环计算各种n值以传递给不同的线程 - 那么您必须避免竞争条件,新线程可能在主线程替换它之前没有读取该值。您可以使用互斥锁来解决这个问题 - 这意味着独立于线程数量需要固定的内存量 - 但代码相对冗长,并且进一步串行化和减慢了线程的启动速度。通常更好的方法是将每个值放入单独的内存地址中。您可以使用具有与您将拥有的新线程数量相同的值的数组,或者为每个double分配堆上的内存,然后让线程读取并释放该内存....


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接