c -我如何得到一个可用的int转换语句从一个空指针?



参数'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 threadsn");
break;
case 1: 
printf("Test 1 from threadsn");
break;
};
sleep(3);
printf("Ending thread...n");
return NULL;
}

函数的第一行是我卡住的地方。我正试图将num1的原始值转换为'n',以便我可以将其用于switch语句。

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

long int n = (long int)&opt;

:

long int n = *(intptr_t*)opt;

然而,这似乎不是一个合适的解决方案。下面的代码看起来不太理想:

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

在这种情况下,如果您只希望它存储值01,则似乎不适合使用类型intptr_t(其设计用于将指针值保存为整数)。

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

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

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

long int n = (intptr_t)opt;

将指针转换回数字。

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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新