繁体   English   中英

C:如何取消引用void **?

[英]C: How to dereference void**?

考虑以下代码:

void* run(void* arg) {
    int* array=(int*)arg;

    printf("In run!\n");
    int i;  
    for (i=0; i<10; i++) {
        printf("%d ",array[i]);
    }
    printf("\n");

    return (void*)15;
}



int main() {

    pthread_t my_thread;
    int array[10]={0};
    void* ret;

    int i;
    for (i=0; i<10; i++) {
        array[i]=i+1;
    }

    if (pthread_create(&my_thread, NULL, run, (void*)array)!=0) {
        perror("thread creation failed");
        return 1;
    }

    pthread_join(my_thread, &ret);

    printf("thread finished and returned %d\n", *(int*)ret); // segfault. why??
    return 0;

}

我正在尝试获取由创建的线程返回的值15,但是由于某种原因,最后一个printf会引发分段错误。
细分错误的原因是什么,以及获取返回值15的正确方法是什么?
我也试过这个:
printf("thread finished and returned %d\\n", *(*(int*)ret));
导致错误:
错误:一元'*'的类型参数无效(具有'int')
和这个:
printf("thread finished and returned %d\\n", *(int*)(*ret));
这也导致了错误(和警告):
警告:取消引用“ void *”指针[默认启用]
错误:无效使用void表达式

什么是正确的方法,最重要的是,发生段错误的原因是什么?

失败的原因是您的线程返回一个整数来代替void* ,并且main的代码尝试取消引用它。

同时执行这两项操作是非法的,但是您可以分别执行以下两项操作:

  • 如果要在指针中返回int ,则可以在将其uintptr_t转换为void*之前将其uintptr_tuintptr_t ,并进行相反的顺序以返回int ,或者
  • 如果希望在main取消引用,则需要将int放入内存中,并传递一个指向该内存的指针,以便可以在main取消引用。

我将使用第一种方法,如下所示:

// Inside run():
return (void*)((uintptr_t)15);
// Inside main():
printf("thread finished and returned %d\n", (int)((uintptr_t)ret));

记住要包含<stdint.h>才能使用uintptr_t类型。

使用第二种方法比较棘手:

// Inside run():
int *ret = malloc(sizeof(int)); // You need to use dynamic allocation here
*ret = 15;
return ret;
// Inside main():
int *run_ret = ret;
printf("thread finished and returned %d\n", *run_ret);
free(run_ret); // You need to free malloc-ed memory to avoid a leak

您可以通过在调用方中为结果分配缓冲区来简化此操作,但是与使用uintptr_t方法相比,这两种方法都将更加困难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM