我如何从 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
类型(旨在将指针值保存为整数)似乎不合适,如果如问题中所示,您只希望它存储值0
或 1
.
您当然可以简单地使用 int
或 long 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;
...
}
这种方法的一个好处是,由于您是按值传递整数,因此如果原始变量超出范围,您就不会 运行 遇到问题。
参数'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
类型(旨在将指针值保存为整数)似乎不合适,如果如问题中所示,您只希望它存储值0
或 1
.
您当然可以简单地使用 int
或 long 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;
...
}
这种方法的一个好处是,由于您是按值传递整数,因此如果原始变量超出范围,您就不会 运行 遇到问题。