将int函数强制转换为void *

问题描述:

将返回的整数值强制转换为void指针有问题。已尝试从这个网站的一些选项,但我的问题似乎仍然没有得到解决。虽然程序编译时没有代码错误,但我得到了分段错误。我瞎了,在我的代码中有一些错误?将int函数强制转换为void *

#include<pthread.h> 
#include<stdio.h> 
#include<stdint.h> 

int ackermann(int a, int b) 
{ 
    if(a==0) 
     return a+1; 
    else if(a>0 && b==0) 
    { 
     return ackermann(a-1, 1); 
    } 
    else if(a>0 && b>0) 
    { 
     return ackermann(a-1,ackermann(a,(b-1))); 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    int a = atoi(argv[1]); 
    int b = atoi(argv[2]); 
    int c = ackermann(a,b); 
    void *ptr = &c; 
    pthread_t mythread; 
    if(pthread_create(&mythread, NULL, ptr, NULL)) 
    { 
     printf("Could not create a thread\n"); 
    } 

    pthread_exit(NULL); 
    return 0; 
} 
+0

适合我:http://ideone.com/AMD4k0 – CinCout

+2

提示:为什么浪费'argc'? –

+6

“pthread_create”的第三个参数是一个指向函数的指针(本例中为'ackerman'),但是你正在传递一个指向'int'的指针。 –

正如在评论中提到的,你实际上并没有调用该函数ackermann在一个单独的线程。你正在做的是从main直接调用该函数,将结果存储在int中,并将指向该int的指针作为pthread_create的第三个参数传递,该指针应该是指向要运行的函数的指针。

现在,ackermann没有相应的签名传递给pthread_create。启动一个新的线程函数应该声明如下:

void *my_thread_function(void *parameter); 

鉴于ackermann被递归调用,这将是清洁剂AA包装函数传递给pthread_create和有包装的呼叫ackermann而不是修改ackermann匹配上面的签名。

由于您需要将多个参数传递给您的线程函数,因此您需要创建一个包含所有参数的struct,并将指向该线程函数的指针传递给该线程函数struct

您还可以将返回值存储在此结构中,以便启动线程的函数可以访问它。

#include<pthread.h> 
#include<stdio.h> 
#include<stdlib.h> 
#include<stdint.h> 

int ackermann(int a, int b) 
{ 
    if(a==0) { 
     return a+1; 
    } else if(a>0 && b==0) { 
     return ackermann(a-1, 1); 
    } else if(a>0 && b>0) { 
     return ackermann(a-1,ackermann(a,(b-1))); 
    } 
    // if none of the above conditions are true, no value is returned 
    // better check for this 
} 

struct ackermann_params { 
    int a; 
    int b; 
    int result; 
}; 

void *ackermann_thr(void *arg) 
{ 
    struct ackermann_params *params = arg; 
    params->result = ackermann(params->a, params->b); 
    return NULL; 
} 

int main(int argc, char* argv[]) 
{ 
    struct ackermann_params params; 
    if (argc < 3) { 
     printf("invalid number of arguments\n"); 
     exit(1); 
    } 
    params.a = atoi(argv[1]); 
    params.b = atoi(argv[2]); 
    pthread_t mythread; 
    if(pthread_create(&mythread, NULL, ackermann_thr, &params)) 
    { 
     perror("Could not create a thread\n"); 
     exit(1); 
    } 
    if (pthread_join(mythread, NULL)) { 
     perror("join failed\n"); 
     exit(1); 
    } 
    printf("result=%d\n", params.result); 

    return 0; 
}