我如何从 void 指针获取 switch 语句的可用 int?

How do i get a usable int for a switch statement from a void pointer?

参数'opt'传递给我的函数用pthread_create:

intptr_t num1 = 0;
pthread_create(&t1, NULL, &routine, &num1)

然后我的函数中有一个 switch 语句,它将根据情况打印两个语句之一:

void* routine(void* opt) {
    long int n = (long int)&opt;
    switch(n) {
    case 0: 
        printf("Test 0 from threads\n");
        break;
    case 1: 
        printf("Test 1 from threads\n");
        break;
    };
    sleep(3);
    printf("Ending thread...\n");

    return NULL;
}

函数的第一行是我卡住的地方。我正在尝试将 num1 的原始值放入 'n' 中,以便我可以将它用于 switch 语句。

您传递的原始值是 intptr_t *,因此您应该将其解读为。

intptr_t *n = opt;
switch(*n) {

为了解决问题,您可以更改行

long int n = (long int)&opt;

至:

long int n = *(intptr_t*)opt;

但是,这似乎不是正确的解决方案。下面的代码看起来不太理想:

intptr_t num1 = 0;
pthread_create(&t1, NULL, &routine, &num1)

在这种情况下,使用 intptr_t 类型(旨在将指针值保存为整数)似乎不合适,如果如问题中所示,您只希望它存储值01.

您当然可以简单地使用 intlong int 而不是数据类型 intptr_t。但我怀疑您选择数据类型 intptr_t 是为了能够直接将值存储在指针中,如下所示:

intptr_t num1 = 0;
pthread_create(&t1, NULL, &routine, (void*)num1 );

如果这样做,那么在函数 routine 中,您可以使用行

long int n = (intptr_t)opt;

将指针转换回数字。

第一个解决方案的缺点是,无论何时取消引用指针,都必须确保引用对象的 lifetime 没有过期。这不是第二种解决方案的问题。

routine 根本没有以要求通过引用传递整数的方式使用参数。也就是说,您只使用整数的值。由于您已经在使用 intptr_t,因此您可以利用 inptr_t 可以安全地转换为指针并返回的事实。

pthread_create(&t1, NULL, routine, (void*)num1);
void *routine(void *opt)
{
    intptr_t n = (intptr_t)opt;
    ...
}

这种方法的一个好处是,由于您是按值传递整数,因此如果原始变量超出范围,您就不会 运行 遇到问题。