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

C:如何取消对void**的引用?,c,pthreads,C,Pthreads,考虑以下代码: 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;

考虑以下代码:

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;

}
void*运行(void*arg){
int*数组=(int*)arg;
printf(“运行中!\n”);
int i;

对于(i=0;i而言,失败的原因是线程返回一个整数来代替
void*
,而
main
中的代码尝试取消对它的引用

同时做这两件事是违法的,但你可以分别做:

  • 如果要在指针中返回一个
    int
    ,可以在转换为
    void*
    之前将其转换为,然后按相反顺序返回一个
    int
    ,或者
  • 如果希望在
    main
    中取消引用,则需要将
    int
    放入内存中,并传回指向该内存的指针,以便可以在
    main
    中取消引用
我将使用第一种方法,如下所示:

// Inside run():
return (void*)((uintptr_t)15);
// Inside main():
printf("thread finished and returned %d\n", (int)((uintptr_t)ret));
要使用
uintpttr\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

您可以通过为调用者中的结果分配缓冲区来简化它,但无论哪种方式,都比使用
uintpttr\t
方法更难。

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

同时做这两件事是违法的,但你可以分别做:

  • 如果要在指针中返回一个
    int
    ,可以在转换为
    void*
    之前将其转换为,然后按相反顺序返回一个
    int
    ,或者
  • 如果希望在
    main
    中取消引用,则需要将
    int
    放入内存中,并传回指向该内存的指针,以便可以在
    main
    中取消引用
我将使用第一种方法,如下所示:

// Inside run():
return (void*)((uintptr_t)15);
// Inside main():
printf("thread finished and returned %d\n", (int)((uintptr_t)ret));
要使用
uintpttr\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

您可以通过为调用者中的结果分配缓冲区来简化它,但无论哪种方式,都比使用
uintpttr\t
方法更难。

代码正在取消对不允许访问的内存的引用。可能
printf(“线程已完成并返回%p\n”,ret)
打印指针。代码正在取消对不允许访问的内存的引用。可能
printf(“线程已完成并返回%p\n”,ret);
打印指针。